【问题标题】:Unable to find html element using selenium无法使用 selenium 找到 html 元素
【发布时间】:2012-01-12 20:31:47
【问题描述】:

我正在使用 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

当我调试它并使用快速监视来动态修改查询时,两个查询都可以正常工作,直到我尝试选择 ul;例如:

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

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

两者都正确选择了包含 ul 的正确 td 的内容。当我试图让他们中的任何一个获得 ul 时,每个选择都变为空。

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

干杯

【问题讨论】:

    标签: xpath selenium css-selectors


    【解决方案1】:

    试试

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

    //a[text()='编辑']

    (如果当前页面上没有更多与此文本的链接)

    【讨论】:

      【解决方案2】:

      不确定为什么添加 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
      

      【讨论】:

        【解决方案3】:

        如果您更熟悉 CSS 选择器,请查看:table tbody tr:first-child ul li:contains('Edit') a

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2020-08-28
            • 2015-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-31
            • 2016-01-22
            • 1970-01-01
            相关资源
            最近更新 更多