【问题标题】:How to locating similar HTML elements in Watir using Ruby如何使用 Ruby 在 Watir 中定位相似的 HTML 元素
【发布时间】:2017-04-20 08:31:12
【问题描述】:

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

这是有效的代码行:

@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>

【问题讨论】:

  • 不清楚,能不能多描述一下
  • 所以一个页面有5个链接。所有 5 个都有相似的源代码。我试图单击它们中的每一个并且只能执行第一个,即使我以相同的方式调用其他 4 个。第一个链接在页面上显示为“快速对齐”,此代码用于定位该链接 -@browser.div(class:'ms-vb itx').link(:text =>'Rapid Alignment').click .第二个链接在页面上显示为“Design Develop Integrate and Test”,此代码无法找到它 -@browser.div(class:'ms-vb itx').link(:text =>'Design Develop集成和测试').click
  • “不起作用”是什么意思?默默失败?引发unable to locate element 错误?如果没有相关的 HTML,这只是猜测。请编辑问题并包含 HTML。
  • 是抛出无法定位元素错误
  • 第一个有效链接的 HTML
    asdm.nwie.net/_layouts/15/…" onclick="EditLink2(this,586);return false;" target="_self">快速对齐

标签: ruby cucumber watir


【解决方案1】:

我认为问题在于使用 #div 将返回单个 div

试试这个

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

然后

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

#divs 返回一个包含EnumerableDivCollection,因此所有Enumerable 方法都可以正常工作,包括select 之类的东西,例如

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

【讨论】:

  • 如果任何部门没有链接并且您的最后一个代码甚至不是预期的答案,您的代码将失败,她不想选择具有快速对齐文本的链接,她想点击所有链接。
  • @RAJ 这是一个如何促进问题的例子。假设ms-vb itx 是一个链接包装器,并且根据发布的 HTML,这似乎是这种情况。至于select,这是一个关于如何从DivCollection 中过滤掉所需链接的示例。附:你的代码也不起作用(那些在玻璃房子里的)
【解决方案2】:

您必须指定您的目标&lt;div&gt;。有两个或更多 &lt;div&gt; 标签具有相同的 class 属性。

鉴于此 HTML sn-p:

<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>

您需要通过在定位器中提供索引来定位适当的&lt;div&gt;

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,它是唯一的。

【讨论】:

  • 这完全没有必要,因为链接文本本身就足以识别链接。
  • "您应该考虑使用 id 属性进行定位,它应该是唯一的。"根据规范,ID必须是唯一的。
【解决方案3】:

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

其实你不需要 div 来定位那个链接,你只要写这段代码就行了

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

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

那个链接文本本身就是那个链接的标识,所以不需要任何分割,直接写b.link()就够了。

【讨论】:

  • 没有索引就吐出错误无法定位错误。谢谢。
  • @Bhuvana 只要您的链接文本是唯一的,您就不需要任何索引。只需尝试写b.a(:text,'Rapid Alignment').click 它肯定会工作。
  • @Raj,它不工作。给出错误元素当前不可见,因此可能无法与之交互。
  • @Bhuvana 好的,那么我猜不止一个链接,所以你使用这个代码b.link(:text=&gt;'Rapid Alignment',:visible=&gt;true).click
  • @RAJ 如果两者都可见,那么您将单击第一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多