【问题标题】:Python: How to use Xpath in Selenium to select the closest neighbor element?Python:如何在 Selenium 中使用 Xpath 来选择最近邻元素?
【发布时间】:2021-07-02 15:25:41
【问题描述】:

我有一长串来自 HTML 页面的表格。以下只是列表的一小部分。

<ul id="exportContentTree" data-space-key="VAG" data-content-tree-src="/spaces/exportspacetree.action" data-content-tree-loaded="true">
<li class="content-tree-node">
   <ul class="content-tree-node-children">
      <li class="content-tree-node">
        <input type="hidden" name="contentToBeExcluded" value="">
        <input type="checkbox" name="contentToBeExported" class="exportContentTreeCheckbox" value="134258951" checked="checked">
        <label class="label" for="contentToBeExported">
          <a href="https://ewiki.abc.com/display/VAG/Getting+Started">Getting Started 
          </a>
        </label>
    </li>
  </ul>
  <ul class="content-tree-node-children">
    <li class="content-tree-node">
      <input type="hidden" name="contentToBeExcluded" value="">
      <input type="checkbox" name="contentToBeExported" class="exportContentTreeCheckbox" value="137464227" checked="checked">
      <label class="label" for="contentToBeExported">                    
        <a href="https://ewiki.abc.com/display/VAG/Queue+Management">Queue Management
        </a>
      </label>
   </li>
  </ul>
<ul class="content-tree-node-children">                    
    <li class="content-tree-node">
        <input type="hidden" name="contentToBeExcluded" value="179758339">
        <input type="checkbox" name="contentToBeExported" class="exportContentTreeCheckbox" value="179758339" checked="checked">
        <label class="label" for="contentToBeExported">                        
          <a href="https://ewiki.abc.com/pages/viewpage.action?pageId=179758339"># Archive #
          </a>
        </label>        
    </li>
</ul>
</li>
</ul>

我想检查&lt;label&gt;标签内&lt;a&gt;标签内的文字是否以#开头,表示内部内容。如果是这样,那么 Selenium 将不会选中元素正上方的复选框 &lt;input type='checkbox'&gt;

在上面给出的代码中,在理想情况下,Selenium 应该选中“Getting Started”和“Queue Management”的复选框,而不是“#Archive#”的复选框

我使用了以下代码,以便 Selenium 可以遍历列表并选中所有复选框。

for topic in browser.find_elements_by_class_name('content-tree-node-children'):
        topic_checkboxes = topic.find_elements_by_xpath('//*[@id="exportContentTree"]/li/*[@class="content-tree-node-children"]/li/*[@class="exportContentTreeCheckbox"]')
for checkbox in topic_checkboxes:
        checkbox.click()

我试图在第二个for循环中添加一个if语句来检查标签之间包裹的链接文本是否以#开头,这不起作用:

for checkbox in topic_checkboxes:
  if checkbox.find_element_by_xpath('//*[@id="exportContentTree"]/li/*[@class="content-tree-node-children"]/li/*[@class="exportContentTreeCheckbox"]/following-sibling::label/*').text.startswith('#') == False:
    checkbox.click()

谁能告诉我哪里做错了?是 Xpath 表达式还是其他什么?

【问题讨论】:

    标签: python selenium xpath


    【解决方案1】:

    下面的xpath:

    //ul[@class='content-tree-node-children']/descendant::label[@for='contentToBeExported']//a[not(starts-with(text(), '#'))]
    

    只会选择在开头没有#a标签。

    我们将not()starts-with() 结合使用以避免任何以# 作为起始文本的锚标记。

    【讨论】:

    • 我的逻辑是,如果标签没有#开头,那么Selenium可以点击复选框。
    • 你可以试试这个xpath点击:-//ul[@class='content-tree-node-children']/descendant::label[@for='contentToBeExported']//a[not(starts-with(text(), '#'))]/../preceding-sibling::input[@type='checkbox']
    • 这行得通!太感谢了。我学到了很好的一课。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2022-11-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多