【问题标题】:Using Ruby and watir-webdriver, how does one get the XPath of an element if the text is known?使用 Ruby 和 watir-webdriver,如果文本已知,如何获取元素的 XPath?
【发布时间】:2014-08-20 21:45:00
【问题描述】:

使用 watir-webdriver,我试图单击屏幕上某些已知文本旁边的“向下”按钮(在本例中为 "An Example")。当我单击向下按钮时,文本本身将向下移动任意长度的列表。我并不总是知道文本将出现在列表中的哪个位置,而且文本上没有 ID 或向下按钮来唯一标识要单击的位置。按钮附加了一个类 ("rowDown down"),但由于可以有多行文本,所以按钮类不是唯一的。

在我无法获得唯一 ID 的情况下,我总是求助于 XPath。

在这种情况下,我知道我关心的文本的 XPath 将以 /div[2] 结尾 我想点击的按钮在div[1],更具体地说,我想要的按钮的XPath以div[1]/button[2]结尾

问题是,如何使用 watir-webdriver 获取文本的 XPath? (我可以处理的完整 XPath 的一个示例是 "//*[@id='sortOrder0']/tbody/tr[2]/td[1]/div[2]"。) 或者,同样可以接受的是,是否有其他可靠的方法可以访问我关心的按钮?

这是我的 HTML 的相关部分,它在“示例”旁边生成一个向上箭头和一个向下箭头:

<div>
  <button class="rowUp up"></button>
  <br />
  <button class="rowDown down"></button>
</div>
<div>
  An Example
</div>

【问题讨论】:

    标签: html ruby xpath watir-webdriver


    【解决方案1】:

    您可以使用text() 在 XPath 期间检查节点的文本。因此,您可以编写一个 XPath,找到带有文本“An Example”的 div,转到前面的 div,然后单击向下按钮:

    browser.button(xpath: '//div[normalize-space(text())="An Example"]
                            /preceding-sibling::div[1]
                            /button[contains(@class, "rowDown")]').click
    

    我个人觉得这很难阅读并且容易出错。我更喜欢使用基本定位器并将 XPath 生成留给 Watir-Webdriver 的内部。可以通过以下方式实现与 XPath 类似的效果:

    browser.div(text: 'An Example').parent.button(class: 'rowDown').click
    

    【讨论】:

    • 谢谢,贾斯汀。我会稍微处理一下,看看我是否可以让它做我需要它做的事情。在您的首选语法中,按钮不直接位于父元素内,而是有一个 div 和一个按钮。我的另一个担忧是直接删除文本“示例”,因为相关网页有时包含隐藏元素。在绝大多数情况下使用文本都有效,但每隔一段时间就会感到困惑。
    • 使用 Watir 方法,按钮位于 div 内就可以了。 Watir 将在父级中的任何位置查找按钮。我不确定我是否理解对使用文本的担忧,因为它与使用 xpath 没有什么不同。但是也许使用正则表达式可以解决它?
    • 啊,我不知道我可以只做 parent.button。很高兴知道!
    • 使用文本的问题在于它可能不像 XPath 那样具体。也就是说,一个元素的 XPath 是唯一的,但是如果文本出现在 HTML 中的多个位置(隐藏元素或其他),那么仅仅关闭文本 Watir 可能会尝试使用与我们想要的文本不同的文本出现它找到。这种担忧在相关页面上可能是没有根据的。我不确定。
    • 就像 xpath 一样,您可以将搜索文本的范围限定为特定元素 - 例如仅查看 sortOrder0 元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多