【问题标题】:How to find text on a webpage and get its XPath or CSS with Selenium and Java如何使用 Selenium 和 Java 在网页上查找文本并获取其 XPath 或 CSS
【发布时间】:2013-02-15 19:26:57
【问题描述】:

有一个页面列出了动态表中的项目。桌子上的顺序和物品数量随机变化。

我想根据文本“Itemx”找到其中一项“Itemx”,然后在代码的另一部分获取并使用它的 XPath 或 CSS。

我可以根据文本“Itemx”找到元素

driver.findElement(By.cssSelector("BODY")).getText().matches("^[\\s\\S]*Itemx[\\s\\S]*$");

但是我怎样才能获得它的 XPath 或 CSS?

我似乎在网上找不到任何东西。那里的所有内容都向您展示了如何使用 XPath 验证或查找文本。对我来说恰恰相反。我有文本,我想找到它的 XPath。

【问题讨论】:

    标签: java css xpath selenium


    【解决方案1】:

    XPath 和 CSS 选择器都是任意的。一般情况下没有很好的答案。

    使用 CSS 选择器选择 <a><b></b><c></c><c></c></a> 中的第一个 c 可能是 c:first-of-type,或 a > c:nth-child(2),或 a c:first-of-type,或 a > b + c,或其他一些东西。与 XPath 类似,有许多表示它的方法。如果更改标记,会发生什么?

    这一切都取决于上下文、所需的稳定性、误报或误报是否更糟(您可以将其设置得非常严格,这样如果标记发生更改,它可能会中断,或者您可以将其设置得非常宽松,这样如果标记更改您很可能选择了错误的东西)以及做这件事的人的心血来潮。 (我会选择以上哪种方式?Eeny、meeny、miny、mo...)

    但是,如果您只关心文档的当前状态并且不需要弹性,首先考虑您是否真的需要这样的选择器。您可以改为传递 DOM 元素。但是,如果您想唯一标识一个元素,那么遍历 DOM 树将是一种相当简单的方法,逐级向下移动,观察该节点是哪个子节点。你最终会得到这样的结果:

    :root > :nth-child(3) > :nth-child(1) > :nth-child(4)
    

    丑陋,但它可能是你想要的。

    【讨论】:

    • +1 以获得精彩的描述。我通常会告诉人们“XPath 和 CSS 定位器就像行车路线,而不是地址。这两种技术都可以将您带到同一个地方,但只有后者唯一地标识了这个地方。
    【解决方案2】:

    如果您可以通过其文本识别项目,则您已经有一个 XPath://*[contains(., 'Itemx')

    【讨论】:

      【解决方案3】:

      Firefox 的萤火虫有一个名为 Firepath 的插件。基本上安装它后,您可以右键单击页面上的任何元素并选择:inspect in FirePath。如果您尝试修改 XPATH 或 CSS SELECTOR 路径更短等,您也可以在这里运行测试。

      【讨论】:

        猜你喜欢
        • 2021-04-14
        • 2021-01-23
        • 2019-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多