2017-04-19 56 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