我使用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元素,还有另一种技术可以用来选择列表中的第一个标签,文本为“编辑”。
干杯
答案 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': '#'}