使用Ruby和watir-webdriver,如果文本已知,如何获取元素的XPath?

时间:2014-08-20 21:45:00

标签: html ruby xpath watir-webdriver

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

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

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

问题是,如何使用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>

1 个答案:

答案 0 :(得分: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
相关问题