2014-10-06 84 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中某些奇怪的换行符引起的,可能只会引用引号。

相关问题