2017-04-19 54 views
0

我试图单击页面上的链接并且只能执行第一个。还有四个代码有相似之处,但它说它找不到其他四个代码。如何使用Ruby在Watir中查找类似的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 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> 
+0

目前尚不清楚,您能否介绍更多 –

+0

因此,网页上有5个链接。所有5个都有类似的源代码。我试图点击它们中的每一个,只能做到第一个,即使我以同样的方式调用其他4个。第一个链接在页面上显示为“快速对齐”,此代码用于找到链接[email protected](class:'ms-vb itx')。link(:text =>'快速对齐')。 。第二个链接在页面上显示为“设计开发集成和测试”,此代码无法找到它[email protected](class:'ms-vb itx')。link(:text =>'Design Develop集成和测试“)。请点击 – Bhuvana

+0

“不起作用”是什么意思?沉默失败?抛出'无法定位元素'错误?没有关联的HTML,这只是猜测。请编辑问题并包含HTML。 – orde

回答

0

您必须指定您的目标是哪个<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是唯一的。

+0

这完全没有必要,因为链接文本本身足以识别链接。 – RAJ

+0

这工作。感谢大家。 – Bhuvana

+0

“您应该考虑使用id属性进行定位,该属性应该是唯一的。”根据规格,ID _必须是唯一的。 Tinman: –

1

我觉得问题是使用#div这将返回一个div

尝试此代替

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

然后

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

#divs返回DivCollection包括Enumerable因此所有Enumerable方法将工作以及包括像select例如

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

如果任何部门没有链接并且您的最后一个代码甚至不是预期的答案,她的代码就会失败,她不想选择具有快速对齐文本的链接,她想单击所有链接链接。 – RAJ

+1

@RAJ这是一个如何促进这个问题的例子。假设'ms-vb itx'是一个链接包装器,并且基于HTML发布,似乎就是这种情况。至于'select',这是一个如何从'DivCollection'过滤掉所需链接的例子。附:你的代码也不会工作(那些在玻璃房子里) – engineersmnky

0

失败的原因是格是相同的,所以它会尝试找到同一div每次并开始搜索给定链路,所以当你试图找到不同的链路失败第二次。

其实你并不需要的div来定位该链接,您只需编写代码,将工作

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

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

该链接的文本本身就是识别该链接,所以你不需要任何分裂,直接写b.link()就够了。

+0

没有索引,它吐出错误无法找到错误。谢谢。 – Bhuvana

+0

@Bhuvana只要你的链接文本是唯一的,你就不需要任何索引。只需尝试写'b.a(:文本,'快速对齐'),点击'它肯定会工作。 – RAJ

+0

@Raj,它不工作。给出错误元素当前不可见,因此可能不会与之交互。 – Bhuvana