Санти прав, что Selenium возвращает первый элемент, соответствующий указанному вами локатору, и вы должны применить соответствующее выражение используемого вами типа локатора. Я подумал, что было бы полезно дать здесь подробности, поскольку в этом случае они граничат с тем, что " gory details ":
CSS
Псевдокласс :nth-child
сложно использовать; у него есть тонкости, которые малоизвестны и , которые недостаточно четко задокументированы даже на страницах W3C. Рассмотрим такой список:
<ul>
<li class="bird">petrel</li>
<li class="mammal">platypus</li>
<li class="bird">albatross</li>
<li class="bird">shearwater</li>
</ul>
Тогда селектор css=li.bird:nth-child(3)
возвращает элемент альбатрос , а не буревестник ! Причина этого в том, что он использует ваш индекс (3) в списке элементов, которые являются родственными элементами первого соответствующего элемента - , не отфильтрованного классом .bird ! Как только у него есть правильный элемент, в этом примере третий, он затем применяет фильтр класса птицы: если соответствующий элемент соответствует, он возвращает его. Если это не так, это не соответствует.
Теперь рассмотрим селектор css=li.bird:nth-child(2)
. Это начинается со второго элемента - утконоса - видит, что это не птица, и появляется пустым. Это проявляется в том, что ваш код выдает исключение "not found"!
Что может соответствовать типичной ментальной модели поиска индексированной записи - это псевдокласс CSS :nth-of-type
, который применяет фильтр перед индексированием . К сожалению, это не поддерживается Selenium, согласно официальной документации на locators .
1034 * XPath *
Ваш вопрос уже показал, что вы знаете, как это сделать в XPath. Добавьте ссылку на массив в любой точке выражения в квадратных скобках. Например, вы можете использовать что-то вроде этого: //*[@id='abc']/div[3]/p[2]/span
, чтобы найти интервал во втором абзаце под 3-м делением под указанным идентификатором.
DOM
DOM использует те же квадратные скобки, что и XPath , за исключением , при котором DOM индексирует с нуля, а XPath с 1: document.getElementsByTagName("div")[1]
возвращает второй div, а не первый div! DOM также предлагает альтернативный синтаксис: document.getElementsByTagName("div").item(0)
в точности эквивалентен. И обратите внимание, что с getElementsByTagName вы всегда должны использовать индекс, поскольку он возвращает набор узлов, а не один узел.