【问题标题】:Selenium xpath text() - simple selection seemingly not workingSelenium xpath text() - 简单的选择似乎不起作用
【发布时间】:2017-09-10 22:00:47
【问题描述】:

我在 Java、Chrome 上使用 Selenium WebDriver 2.53.1。

我找到一个元素并将其保存在名为 dropdownMenuList 的 WebElement 变量中。这是它的外层HTML,已格式化。

<ul tabindex="-1" class="dropdownMenu apmurldropdownmenu thing menu" role="menu" aria-label="Menu region">
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem">
        <div class="thing text">CardNameWebpage</div>
    </li>
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem">
        <div class="thing text">CardNameWebpage</div>
    </li>
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem">
        <div class="thing text">CardNameWebpage</div>
    </li>
    <!-- react-text: 9 -->
    <!-- /react-text -->
</ul>

然后我通过 xpath 在里面搜索:

dropdownMenuList.findElement(By.xpath("*[text()='CardNameWebpage']"));

我得到一个 NoSuchElementException。但是 HTML 包含此文本的所有三个元素。我做错了什么?

【问题讨论】:

    标签: selenium xpath


    【解决方案1】:

    您应该在前面加上两个斜杠 (//),因为您要查找的元素不在顶层

    "//*[text()='CardNameWebpage']"
    

    要找到当前元素的后代元素(paul tremberth 绝对正确:)),请在 xpath 的开头添加点

    ".//*[text()='CardNameWebpage']"
    

    【讨论】:

    • 如果我使用 // 它从文档顶部搜索。我只需要从这个元素中搜索。
    • 那就试试.//*[text()='CardNameWebpage'](相对位置路径)
    • 在这种情况下,我会将* 替换为div 以使其更具体......但这可能只是我。 :)
    【解决方案2】:

    已编辑:您需要更改为 //*[text()='value']//*[contains(text(),'value')]

    【讨论】:

    • 我认为他的意思是 //*[text()='value'] 或 //*[contains(text(), 'value')] 因为你知道它是一个列表项,你在这两种情况下都可以将“*”替换为“li”,并且在包含版本中,您可以替换为“.”。对于“文本()”
    • 如果我使用 // 它从文档顶部搜索。我只需要从这个元素中搜索。
    • 不,// 只是告诉它从其相对位置搜索“*”。 // 与 / 相比所做的是查找项目,跳过其间的任何节点级别。如果是 //li[contains("boo")],它将从当前所在的行开始查找包含“boo”的第一个列表项。
    • 不幸的是,我已经被 // 从文档的根目录而不是我调用该方法的元素开始搜索。我应该使用 ./ 还是 .// ,也许?我还不确定 / vs // 是如何工作的。
    • 是的,你应该这样做。使用 .// 查找所有级别的后代元素
    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 2020-09-18
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多