Automation 访问Watir中没有属性的元素

Automation 访问Watir中没有属性的元素,automation,automated-tests,watir,watir-webdriver,webautomation,Automation,Automated Tests,Watir,Watir Webdriver,Webautomation,使用Watir,有没有一种方法可以访问没有属性的元素 @browser.div(:name => "content").span(:index => 1) #this is the first span element inside this div 例如: <span>Text</span> @browser.div(:name => "content").span(:index => 1) #this is the first span e

使用Watir,有没有一种方法可以访问没有属性的元素

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

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

我希望避免使用xpath,但如果这是唯一一种很酷的方法。

忽略首先要有标记的非WATIR问题,或者从开发人员(或您自己)处请求唯一属性,您始终可以通过其父元素或通过索引访问元素

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

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
在到达子span元素之前,您可以使用任意多个唯一元素,而无需使用Xpath。当然,您只需要一个唯一的父元素就可以到达那个特定的子元素,并且可以从那个子元素一直到子元素

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
div(:how => what).table(:how => what).td(:how => what).span(:how => what).text
另一个示例,假设它是页面上的第n个跨距: @span(:index=>n)

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
但是,当对页面进行任何更新时,“按索引”方法非常脆弱,并且容易中断。

如果页面有文本:

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
browser.span(:text => "Text")
如果您只知道部分文本,则可以使用正则表达式:

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

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

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
如果已知元素位于所需元素的内部,则可以从该元素开始,并使用
.parent
方法获取“container”元素。这也可用于通过使用.parent通过公共容器(如表行)访问所需的元素来查找“同级”元素。第一种用法相当明显,但第二种用法可能更常见,在处理表时非常有用

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
例如,假设您有一个包含多行数据的表,其中一列是唯一的零件号,另一列有“添加到购物车”链接。现在,如果您想将特定部分添加到购物车中,您可以使用索引和文本“add to cart”,使用类似这样的代码,因为它是该特定文本的第五个链接

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
browser.link(:text => 'add to cart', :index => 4).click
但这是脆弱的,因为一旦结果发生变化(这在实时数据中经常发生),您的部分就不再是该表中的第五个部分,您的测试就会中断。如果您找到了正确的零件,则需要进行一些验证,而不是该行的其他内容。但是,在watir中,您可以执行以下操作:

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
browser.cell(:text => 'Part no. 123-45').parent.link(:text => 'add to cart').click
在表格单元格的情况下,单元格的父单元格通常是一个表格行,因此在简单的英语中,这转换为“查找包含零件号123-45的单元格”,然后在同一行中查找并单击“添加到购物车”链接。(虽然我猜你只是通过阅读代码就知道了。)

@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div
您可以使用它来获取任何“兄弟”或甚至只是“父”本身,其中在您需要与之交互的对象旁边或内部有一些独特的元素

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

您可能可以使用Xpath执行类似的操作,但祝您在五周后阅读代码时好运。这是我非常喜欢Watir和Watir Webdriver而不是Selenium的一个原因。

请注意,如果您使用的是使用基于一个索引的Watir的旧版本,而Watir 2.x或Watir Webdriver使用基于零的索引(如Ruby),这只是第一个跨度
:index=>1
将是divI中span的第二个实例。我从来没有想到过一个简单问题会有这么多答案。一个简单的问题,但以非常一般的形式呈现,没有任何上下文或周围的HTML。因此,答案的多样性远不如问题的一般性。诚然,我的目标是一个更狭隘的领域。。嗯,我想到了一个有用的编辑。@DaveMcNulla,我修改过的答案现在是否把其他答案放到了更详细的上下文中?这确实说明了三个不同的答案。我也很欣赏我学到的关于使用对象中的关系来查找和操作xpath解决方案的经验。
@browser.div(:name => "content").span(:index => 1)
#this is the first span element inside this div