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

如何使用Ruby在Watir中定位类似的HTML元素,ruby,cucumber,watir,Ruby,Cucumber,Watir,我试图点击页面上的链接,但只能点击第一个链接。还有四个有类似的代码,但它说找不到其他四个 这是一行有效的代码: @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: 我认为问题在

我试图点击页面上的链接,但只能点击第一个链接。还有四个有类似的代码,但它说找不到其他四个

这是一行有效的代码:

@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,它将返回一个div

试试这个

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

divs返回一个DivCollection,其中包含Enumerable,因此所有Enumerable方法都可以工作,包括select等


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

实际上,您不需要div来定位该链接,只需编写以下代码即可

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

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

那个链接文本本身就是那个链接的标识,所以你不需要任何除法,直接写b.link,就足够了

您必须指定您的目标。有两个或多个标记具有相同的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>

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

不清楚,您能描述MeSeo页面上有5个链接吗?所有5个都有相似的源代码。我试着点击它们中的每一个,并且只能做第一个,即使我用同样的方式调用其他4个。第一个链接在页面上显示为“快速对齐”,此代码用于定位该链接-@browser.divclass:“ms-vb itx”。链接:text=>“快速对齐”。单击。第二个链接在页面上显示为“设计-开发-集成和测试”,此代码无法定位它-@browser.divclass:“ms-vb itx”。链接:text=>“设计-开发-集成和测试”。单击“不工作”是什么意思?默默地失败?抛出“无法定位元素”错误?没有相关的HTML,这只是猜测。请编辑问题并包含HTML。Yes抛出一个无法定位第一个链接的元素errorHTML,该链接在onclick=EditLink2this,586;返回false;Trime= AyAuto>快速对齐,这是完全不必要的,因为链接文本本身足以标识链接。您应该考虑使用ID属性定位,这应该是唯一的。根据规范,ID必须是唯一的。如果任何一个部门没有链接,并且您的最后一个代码甚至不是预期的答案,您的代码将失败。她不想选择具有快速对齐文本的链接,她想单击所有链接。@RAJ这是一个如何简化问题的示例。假设ms vb itx是一个链接包装器,根据发布的HTML,情况似乎就是这样。至于select,这是一个如何从DivCollection中过滤出所需链接的示例。另外,你的代码在没有索引的玻璃房子里也不起作用,它会吐出无法定位错误的错误。谢谢。@Bhuvana只要链接文本是唯一的,您就不需要任何索引。只要试着写b.a:文本“快速对齐”。点击它肯定会起作用。@Raj,它不起作用。给定错误元素当前不可见,因此可能无法与之交互。@Bhuvana好的,那么我猜存在多个链接,因此您使用此代码b.link:text=>'Rapid Alignment',:visible=>true。click@RAJ如果两者都可见,那么您将单击第一个
divs.select { |d| d.link(:text =>'Rapid Alignment') }
b.link(:text=>'Rapid Alignment',:visible=>true).click

b.link(:text=>'Design Develop Integrate and Test',:visible=>true).click
<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>
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