2014-10-06 110 views
1

上的Watir的備忘和文檔顯示像這樣設置一個單選按鈕如何用標籤文本選擇Watir中的單選按鈕?

b.radio(:id => "radio").set 

如何選擇一個單選按鈕基於文本旁邊

有時候這個文本是在標籤標籤裏面的,有時它只是在一些div/form標籤裏面。我們如何在Watir中處理這個問題?

(在以下實施例中CAPS標籤文本)

實施例1:

<form action=""> 
<input type="radio" value="male" name="sex"/> 
MALE 
<br/> 
<input type="radio" value="female" name="sex"/> 
FEMALE 
</form> 

實施例2:

<div class="isoversixteen_false_container"> 
<input id="isoversixteen_false" class="radio" type="radio" value="0" name="isoversixteen" autocomplete="off"/> 
<label class="isoversixteen_false_label" for="isoversixteen_false"> 
<span class="label_main">UNDER 16</span> 
</label> 
</div> 
<div class="isoversixteen_true_container"> 
<input id="isoversixteen_true" class="radio" type="radio" value="1" name="isoversixteen" autocomplete="off" checked="checked"/> 
<label class="isoversixteen_true_label" for="isoversixteen_true"> 
<span class="label_main">16 OR OVER</span> 
</label> 
</div> 
+1

你在例1中有獨特的'value'屬性,所以你可以做'b.radio(:value =>「male」).set'。在例#2中,有獨特的'id'屬性,所以像'b.radio(:id =>「isoversixteen_true」)。set'應該可以工作。您是否有理由將該文本用作定位符? – orde 2014-10-06 15:50:50

回答

1

奧德的大約的使用屬性註釋輸入元素是一個好主意,因爲它是最容易的節目。然而,爲了回答這個問題:

實施例1 - 相鄰的文本節點

在這個例子中,所需的文本是在相鄰的文本節點。鑑於單選按鈕共享相同的父,我認爲最簡單的解決辦法是使用XPath:

browser.radio(xpath: '//input[following-sibling::text()[1][normalize-space(.) = "MALE"]]').set 
browser.radio(xpath: '//input[following-sibling::text()[1][normalize-space(.) = "FEMALE"]]').set 

中的XPath說來:

  1. 找到一個輸入元素,其中
  2. 下面的文字節點 - 即[1]
  3. 有文字「男」或「女」,忽視了領先/以下的空間 - 即[normalize-space(.) = "FEMALE"]

實施例2 - 標籤文本

在這個例子中,複選框有一個正確相關聯的標籤元件 - 即複選框的ID作爲標籤的屬性相匹配。 - 先上後下的非空白文本節點

如果你想與這兩個例子中工作的單一解決方案,下面似乎

browser.radio(label: 'UNDER 16').set 
browser.radio(label: '16 OR OVER').set 

例子:的Watir支持通過:label定位器定位通過他們的標籤文本元素工作:

browser.radio(xpath: '//input[following::text()[normalize-space(.) != ""][1][normalize-space(.) = "UNDER 16"]]').set 
browser.radio(xpath: '//input[following::text()[normalize-space(.) != ""][1][normalize-space(.) = "16 OR OVER"]]').set 
browser.radio(xpath: '//input[following::text()[normalize-space(.) != ""][1][normalize-space(.) = "MALE"]]').set 
browser.radio(xpath: '//input[following::text()[normalize-space(.) != ""][1][normalize-space(.) = "FEMALE"]]').set 

這裏的意圖是要找到有文字的複選框(在[normalize-space(.) != ""][1]部分)後的第一個文本節點和文本的預期相匹配TEX t([normalize-space(.) = "UNDER 16"部分)。

+0

嗨@Justin,非常感謝你的回答。我會嘗試兩種方式。我想知道我們是否可以採用一種廣義的方式來做到這一點?因爲我在Watir的set方法上編寫了一個包裝器,它將只讀取標籤文本並設置單選按鈕:)。 – 2014-10-07 04:48:47

+0

看來您可以製作一個適用於這兩個示例的單個XPath(請參閱更新後的答案)。我之前沒有必要做這個XPath,所以我不確定這些限制/風險在哪裏。 – 2014-10-07 13:11:24

+0

精彩!!我已經使用條件循環在更新之前實現了你的答案,現在如果這樣做,沒有什麼更好的了:) – 2014-10-08 02:37:05

2

這是HTML結構我在我的例子:

<div class="radio-inline"> 
<label for="job_type">Second Type</label> 
<input id="job_service" name="job" type="radio" value="remote"> 
</div> 

一般情況下我與選擇它:

@browser.input(:value => 'remote').click 

然而,根據您的問題,我想看看我是否能選擇通過文本。我發現這個工作,但可能依賴於嵌套在div中的標籤。

@browser.label(:text => /Second Type/).click 

/around「Second Type」是由於HTML中某些奇怪的換行符引起的,可能只會引用引號。