如何使用 Ruby 在 Watir 中定位相似的 HTML 元素

How to locating similar HTML elements in Watir using Ruby

我正在尝试单击页面上的链接,但只能执行第一个链接。还有四个具有相似的代码,但它说它无法找到其他四个。

这是有效的代码行:

@browser.div(class:'ms-vb itx').link(:text =>'Rapid Alignment').click 

这是四个不起作用的之一:

@browser.div(class:'ms-vb itx').link(:text =>'Design Develop Integrate and Test').click

HTML:

<div class="ms-vb itx" onmouseover="OnItem(this)" CTXName="ctx586" id="1" Field="LinkTitle" Perm="0xb008031061" EventType=""><a onfocus="OnLink(this)" href="asdm.nwie.net/_layouts/15/…; onclick="EditLink2(this,586);return false;" target="_self">Rapid Alignment</a></div>

<div class="ms-vb itx" onmouseover="OnItem(this)" CTXName="ctx586" id="3" Field="LinkTitle" Perm="0xb008031061" EventType=""><a onfocus="OnLink(this)" href="asdm.nwie.net/_layouts/15/…; onclick="EditLink2(this,586);return false;" target="_self">Design Develop Integrate and Test</a></div>

我认为问题在于 #div 的使用,它将 return 单个 div

试试这个

divs = @browser.divs(class:'ms-vb itx')

然后

divs.each do |d|
  d.link.click
end

#divs returns a DivCollection 其中包括 Enumerable 所以所有 Enumerable 方法也可以工作,包括像 select 这样的东西,例如

divs.select { |d| d.link(:text =>'Rapid Alignment') }

这失败了,因为 div 是相同的,所以它每次都尝试定位相同的 div 并开始搜索给定的 link,因此当您尝试定位时第二次失败不同的 link.

实际上你不需要 div 来定位那个 link,你只需编写这段代码就可以了

b.link(:text=>'Rapid Alignment',:visible=>true).click

b.link(:text=>'Design Develop Integrate and Test',:visible=>true).click

那个link文本本身就是那个link的标识,所以你不需要任何division,直接写b.link()就可以了.

您必须指定 <div> 您的目标。有两个或更多 <div> 标签具有相同的 class 属性。

鉴于此 HTML 片段:

<div class="ms-vb itx" onmouseover="OnItem(this)" CTXName="ctx586" id="1" Field="LinkTitle" Perm="0xb008031061" EventType=""><a onfocus="OnLink(this)" href="asdm.nwie.net/_layouts/15/…" onclick="EditLink2(this,586);return false;" target="_self">Rapid Alignment</a></div> 

<div class="ms-vb itx" onmouseover="OnItem(this)" CTXName="ctx586" id="3" Field="LinkTitle" Perm="0xb008031061" EventType=""><a onfocus="OnLink(this)" href="asdm.nwie.net/_layouts/15/…" onclick="EditLink2(this,586);return false;" target="_self">Design Develop Integrate and Test</a></div>

您需要通过在定位器中提供索引来定位适当的 <div>

p b.div(:class => 'ms-vb itx').link(:text => 'Rapid Alignment').exists?
#=> true
p b.div(:class => 'ms-vb itx').link(:text => 'Design Develop Integrate and Test').exists?
#=> false
p b.div(:class => 'ms-vb itx', :index => 1).link(:text => 'Design Develop Integrate and Test').exists?
#=> true

但是如果 UI 元素发生变化,通过索引定位元素可能会很脆弱。您应该考虑使用 id 属性进行定位,根据 spec,这些属性是唯一的。