2012-03-20 2 views
4

Каковы некоторые хорошие способы извлечения определенного элемента в WebDriver/Selenium2, основанного только на тексте внутри элемента?Получить конкретный элемент в webdriver, содержащий текст

<div class="page"> 
    <ul id="list"> 
    <li>Apple</li> 
    <li>Orange</li> 
    <li>Banana</li> 
    <li>Grape</li> 
    </ul> 
</div> 

По сути, я хотел бы написать что-то вроде этого, чтобы получить определенный элемент:

@driver.find_element(:id, "list").find_element(:text, "Orange") 

Это очень похоже на то, как я хотел бы использовать селектор при нахождении текста внутри ссылки (т.е. :link_text или :partial_link_text), но я хотел бы найти элементы по тексту внутри обычных, не связанных элементов.

Любые предложения? Как вы справляетесь с этой проблемой? (Если вам интересно, я использую Ruby.)

ответ

3

Через пару лет поздно, но я просто хочу, чтобы задать этот вопрос и ответить на него, чтобы другие могли найти его ...

Я использовал селектор CSS, чтобы получить все элементы Ли и затем фильтруется массив, основанный на тексте:

@driver.find_elements(css: '#list > li').select {|el| el.text == 'Orange'}.first 

затем можно .click или .send_keys :return, чтобы выбрать опцию.

6

Вы можете сделать это с помощью xPath. Нечто подобное для примера:

@driver.find_element(:id, "list").find_element(:xpath, './/*[contains(., "Orange")]') 
+0

Спасибо. Предпочитаю не использовать xpath вообще, но все же, спасибо за отличный ответ! – bbbco

+0

Не знал, что вы можете связать 'find_element', я предполагаю, что он ищет только дочерние элементы первого элемента ... nice. ;) – erroric

+1

Да, вызов find_element в драйвере начинается с корня, а вызов этого элемента начинается с этого элемента. Я думаю, что XPath мог бы переопределить это (поэтому, если «.» Не был в начале XPath, он все равно может начинаться с корня документа по указанию //), но я точно не помню, как правильно Теперь. –