2012-01-11 161 views
1

我使用硒来测试我的webapp与chromedriver,但硒似乎无法找到我想要的元素。无法使用硒查找html元素

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

我想选择的Web元素:

<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) 

AND

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

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

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

干杯

回答

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

试试

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

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

(如果不会有这种文字当前页面上的多个链接)

0

如果你更舒适的使用CSS选择器,请上网:table tbody tr:first-child ul li:contains('Edit') a

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