如何使用 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,这些属性是唯一的。
我正在尝试单击页面上的链接,但只能执行第一个链接。还有四个具有相似的代码,但它说它无法找到其他四个。
这是有效的代码行:
@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,这些属性是唯一的。