Как выбрать первый элемент из найденных.

silenium
поиск по CSS "[id^='ПН_']" выдает три элемента
я меняю на"[id^='ПН_']:first-child .ivtitle a" и он не находит ни одного.
пробовал сделать по xpass By.xpath("//input[@id =\"ПН_\"]")) , но по xpass не находит ничего

поиск осуществляется по неизменяемой части id либо class либо value

1 лайк
By.xpath("//input[@id ='ПН_'][x]")) , x - номер элемента

У webdriver есть два метода findElement - находит один элемент по атрибуту который вы указываете, а есть еще findElements - находит все элементы по атрибуту и возвращает список всех найденых элементов. Вы можете воспользоваться вторым методом и просто взять первый элемент из списка

1 лайк

я про этот вариант знаю но он не совсем подходит

а чего не подходит? Какой контекст? Вроде этим решением все и пользуются, сам так неоднократно выбирал порядок элементов, для разных ситуаций…

а чем именно он не подходит ? Можно конечно воспользоваться xpath , который предложили выше . Есть пару вариантов решения этой проблемы :

  1. Xpath
  2. findElements
  3. Прописать уникальные айдишки каждому элементу и обращаться по id , если это возможно конечно.

Сам я стараюсь всегда использовать третий способ, когда ситуация позволяет.

по вашему примеру ничего не находит, “ПН_” это не полностью id а его неизменяемая часть.

By.xpath("//input[contains(@id, 'ПН_')][x]"))
By.xpath("//input[starts-with(@id, 'ПН_')][x]"))

Поставьте себе на Firefox плагин: FirePath for FireBug.
Там легко тестировать свои Xpath и CSS локаторы.

Сам так пользуюсь всегда получаю список, и потом на нужный элемент кликаю, но в данной ситуации стало интересно можно ли выбрать всегда первый\последний найденный элемент.

(By.xpath(“By.xpath(”//input[starts-with(@id, ‘ПН_’)][1]"))") упал InvalidSelector
By.xpath("//input[contains(@id, ‘ПН_’)][1]")) упал InvalidSelector

Извините не правильно ввел селектор

В CSS не нашел.
А вот для Xpath есть рецепт.
Первый элемент ищется по [1], а последний по [last()]

синтетический пример
.//*[@id='someid']/tr[1]
.//*[@id='someid']/tr[last()]
1 лайк

driver.findElement(By.xpath("//input[contains(@id,‘ПН’)][1]"))
вот так кликает по первому
driver.findElement(By.xpath("//input[contains(@id,‘ПН’)]/tr[last()]"))
а так падает NoSuchElementEx

driver.findElement(By.xpath("//input[contains(@id,‘ПН’)][1]"))
вот так кликает по первому
driver.findElement(By.xpath("//input[contains(@id,‘ПН’)]/tr[last()]"))
а так падает NoSuchElementEx

Возникла ситуация где нужно независимо от количества элементов на странице всегда кликать на последний(сначала думал на первый), можно сделать через list, написать метод, но стало интересно можно ли в локаторе просто указать последний из списка

“[id^=‘ПН_’]:last-child” css будет работать, если все найденные элементы принадлежат одному родителю (CSS Selector)

driver.findElements(By.cssSelector("[id^=‘ПН_’]:last-child")) size=0

driver.findElements(By.cssSelector("[id^=‘ПН_’]")) size =1

это значит что не к одному родителю да?

Ввела Вас в заблуждение: эти sizzle selector работают только с самим элементом без селектора, то есть div:first-child будет работать, а то что выше написано - нет. Может так сработает [id^=‘ПН_’] div:first-child или div:first-child [id^=‘ПН_’] (div замените на свой элемент)

driver.findElement(By.xpath("//input[contains(@id,'ПН')][1]"))
driver.findElement(By.xpath("//input[contains(@id,'ПН')][last()]"))

tr - зачем вставили? Это же для примера было.