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

java
locators
css-selectors
selenium
webdriver
Теги: #<Tag:0x00007fedbb604180> #<Tag:0x00007fedbb60bf98> #<Tag:0x00007fedbb60bde0> #<Tag:0x00007fedbb60bca0> #<Tag:0x00007fedbb60bb38>

(pauloo89) #1

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

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


(Bolatbek) #2

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

(Andrew Zakordonets) #3

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


(pauloo89) #4

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


(Eugene Moskalenko) #5

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


(Andrew Zakordonets) #6

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

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


(pauloo89) #7

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


(Bolatbek) #8

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

(Bolatbek) #9

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

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


(pauloo89) #10

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


(pauloo89) #11

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


(pauloo89) #12

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


(Bolatbek) #13

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

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

(pauloo89) #14

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


(pauloo89) #15

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


(pauloo89) #16

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


(Алеся) #17

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


(pauloo89) #18

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

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

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


(Алеся) #19

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


(Bolatbek) #20

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

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