Selenium RC локаторы - ссылаясь на последующие элементы? - PullRequest
0 голосов
/ 02 июня 2009

Если на странице более одного элемента с одним и тем же локатором, как следует ссылаться на следующие элементы?

Используя локаторы Xpath, можно добавить нотацию массива, например, = XPath (// оболочка / дел) [1] Но с простыми локаторами?

Например, если есть 3 ссылки, идентифицированные как "link = Click Here", простое добавление [3] не получит третий элемент.

А где авторитетная ссылка для адресации массива элементов? Я не смог найти ни одного.

Ответы [ 2 ]

2 голосов
/ 13 августа 2009

Selenium не обрабатывает массивы локаторов самостоятельно. Он просто возвращает первый элемент, который соответствует вашему запросу, поэтому, если вы хотите это сделать, вы должны использовать xpath, dom или даже лучше, css.

Так что для примера ссылки вы должны использовать:

selenium.click("css=a:contains('Click Here'):nth-child(3)")
0 голосов
/ 02 марта 2011

Санти прав, что 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 вы всегда должны использовать индекс, поскольку он возвращает набор узлов, а не один узел.

...