Search code examples
rubycucumberwatir

How to locating similar HTML elements in Watir using Ruby


I am trying to click links on a page and able to do only the first one. There are four more having similar code, but it says it cannot locate the other four.

This is the line of code that works:

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

This is one of the four that does not work:

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

Solution

  • You'll have to specify which <div> you are targeting. There are two or possibly more <div> tags with the same class attribute.

    Given this HTML snippet:

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

    You need to target the appropriate <div> by supplying the index in the locator:

    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
    

    But locating elements by index can be fragile if and when UI elements change. You should consider locating using the id attributes, which--according to spec--are unique.