6

使用 Watir,有没有办法访问没有属性的元素?

例如:

<span>Text</span>

我想避免使用 xpath,但如果这是唯一的方法,那就太酷了。

4

3 回答 3

11

先不管标签的非 WATIR 问题,或者向开发人员(或您自己)请求唯一属性,您始终可以通过其父元素或索引访问元素。

例如:文本

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div

在到达子 span 元素之前,您可以处理许多您需要的独特元素,而无需使用 Xpath。当然,您只需要一个唯一的父元素即可到达该特定的子元素,然后您就可以从它向下处理到子元素。

div(:how => what).table(:how => what).td(:how => what).span(:how => what).text

另一个例子,假设它是页面上的第n 个跨度:@browser.span(:index => n )

但是,按索引方法非常脆弱,并且在对页面进行任何更新时容易中断。

于 2011-11-30T19:11:58.937 回答
9

如果有文字:

browser.span(:text => "Text")

如果您只知道部分文本,则可以使用正则表达式:

browser.span(:text => /Text/)
于 2011-11-30T20:29:59.263 回答
8

基本上有三种方法可以解决这一特殊挑战。Zeljko 已经解决了第一个问题,它基于元素内部的内容例如已知文本。Adam 介绍了最常见的方式,包含或包含元素的内容 我将介绍第三种方式,即包含元素中或旁边的内容

如果您有一个已知元素在您想要的元素中,那么您可以从它开始并使用该.parent方法获取“容器”元素。这也可以用于查找“兄弟”元素,方法是使用 .parent 通过一个公共容器(例如表格行)获取您想要的元素。第一种用法相当明显,但第二种用法可能更常见,并且在处理表格时非常有用。

例如,假设您有一个包含多行数据的表,其中一列是唯一的零件编号,另一列具有“添加到购物车”链接。现在,如果您想将特定部件添加到购物车,您可以使用 Index 与文本“添加到购物车”结合使用这样的代码,因为它是包含该特定文本的第 5 个链接

browser.link(:text => 'add to cart', :index => 4).click

但这很脆弱,因为一旦结果发生变化(实时数据可能会发生很多情况),您的部分不再是该表中的第 5 部分,您的测试就会中断。您需要进行一些验证,您已经找到了正确的部分,而不是该行上的其他内容。但是,在 watir 中,您可以执行以下操作:

browser.cell(:text => 'Part no. 123-45').parent.link(:text => 'add to cart').click

在表格单元格的情况下,单元格的父级通常是表格行,因此用简单的英语翻译为“找到其中包含“部件号 123-45”的单元格,然后在同一行中查找并单击“添加到购物车”链接。(虽然我猜你只是通过阅读代码就知道了。)

您可以使用它来获取任何“兄弟”,甚至只是“父”本身,其中在您需要与之交互的对象旁边或内部有一些独特的元素。

您可能可以使用 Xpath 做类似的事情,但是在五周后阅读代码时,祝您好运。这是我非常喜欢 Watir 和 Watir-Webdriver 与 Selenium 的原因之一。

于 2011-11-30T21:15:36.000 回答