无法使用selenium找到html元素

时间:2012-01-11 12:29:56

标签: xpath selenium css-selectors

我使用selenium用chromedriver测试我的webapp但是selenium似乎找不到我想要的元素。

我要查询的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

当我调试它并使用quickwatch动态修改查询时,两个查询都会起作用,直到我尝试选择ul;例如:

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

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

两者都正确选择包含ul的正确td的内容。当我尝试让其中任何一个获得ul时,每个选择都变为null。

所以我有两个问题,为什么我无法使用CSS选择器或XPath选择ul元素,还有另一种技术可以用来选择列表中的第一个标签,文本为“编辑”。

干杯

4 个答案:

答案 0 :(得分:2)

尝试

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

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

(如果当前页面上没有此文字的链接)

答案 1 :(得分:1)

在添加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

答案 2 :(得分:0)

如果您对CSS选择器感到满意,请查看:table tbody tr:first-child ul li:contains('Edit') a

答案 3 :(得分:0)

'//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': '#'}