使用 Watir,有没有办法访问没有属性的元素?
例如:
<span>Text</span>
我想避免使用 xpath,但如果这是唯一的方法,那就太酷了。
使用 Watir,有没有办法访问没有属性的元素?
例如:
<span>Text</span>
我想避免使用 xpath,但如果这是唯一的方法,那就太酷了。
先不管标签的非 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 )
但是,按索引方法非常脆弱,并且在对页面进行任何更新时容易中断。
如果有文字:
browser.span(:text => "Text")
如果您只知道部分文本,则可以使用正则表达式:
browser.span(:text => /Text/)
基本上有三种方法可以解决这一特殊挑战。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 的原因之一。