Невозможно найти элемент HTML, используя селен - PullRequest
1 голос
/ 11 января 2012

Я использую селен для тестирования моего веб-приложения с помощью chromedriver, однако селен не может найти нужный мне элемент.

HTML-код, который я запрашиваю:

<table>
   <thead><thead>
   <tbody>
     <tr>
       <td></td>
       <td>
          <span class="class1">
            <span>Test text</span>
          </span>
          <ul>
            <li class="class2"><a href="#">Edit</a></li>
            <li class="class2"><a href="#">Remove</a></li>
         </ul>
       </td>
     </tr>
   </tbody>
</table>

Я пытаюсь выбрать веб-элемент:

<a href="#">Edit</a>

Я пробовал следующее с помощью селекторов CSS:

table > tbody > tr:first-child > td:nth-child(2) > ul > li:first-child > a

и такой же запрос с использованием XPath:

//table/tbody/tr/td/following-sibling::td[1]/ul/li/a

Когда я отлаживаю это и использую быстрые часы для динамического изменения запроса, оба запроса работают до тех пор, пока я не попытаюсь выбрать ul; например:

table > tbody > tr:first-child > td:nth-child(2)

И

//table/tbody/tr/td/following-sibling::td[1]

Оба правильно выбирают содержимое правильного тд, содержащего ул. Когда я пытаюсь заставить любого из них получить ul, каждый из вариантов выбора становится нулевым.

Итак, у меня есть две проблемы: почему я не могу выбрать элемент ul с помощью селекторов CSS или XPath, и есть ли другой метод, который я могу использовать, чтобы выбрать первый тег в списке с текстом «Редактировать».

Приветствия

Ответы [ 4 ]

2 голосов
/ 11 января 2012

Попробуйте

//table/tbody/tr/td[2]/ul/li[1]/a

или

//a[text()='Edit']

(если на текущей странице больше не будет ссылок с этим текстом)

1 голос
/ 11 января 2012

Не совсем уверен, почему ваш селектор сломался после добавления ul, но попробуйте этот селектор CSS в качестве альтернативы:

table > tbody > tr:first-child > td:nth-child(2) li.class2:first-child > a

Или это эквивалентное выражение XPath:

//table/tbody/tr/td[2]//li[@class="class2"][1]/a
0 голосов
/ 12 января 2012

'//table//li/a[text()="Edit"]'

Вот пример сеанса ipython:

In [1]: from lxml import etree

In [2]: html = """
   ...: <table>
   ...:    <thead><thead>
   ...:    <tbody>
   ...:      <tr>
   ...:        <td></td>
   ...:        <td>
   ...:           <span class="class1">
   ...:             <span>Test text</span>
   ...:           </span>
   ...:           <ul>
   ...:             <li class="class2"><a href="#">Edit</a></li>
   ...:             <li class="class2"><a href="#">Remove</a></li>
   ...:          </ul>
   ...:        </td>
   ...:      </tr>
   ...:    </tbody>
   ...: </table>
   ...: """

In [3]: t = etree.fromstring(html, parser=etree.HTMLParser())

In [4]: t.xpath('//table//li/a[text()="Edit"]')
Out[4]: [<Element a at 101c83b50>]

In [5]: a = t.xpath('//table//li/a[text()="Edit"]')[0]

In [6]: a.text
Out[6]: 'Edit'

In [7]: a.attrib
Out[7]: {'href': '#'}
0 голосов
/ 11 января 2012

Если вам удобнее использовать CSS-селекторы, проверьте: table tbody tr:first-child ul li:contains('Edit') a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...