如何在标签文本中选择Watir中的单选按钮?

时间:2014-10-06 14:22:33

标签: ruby radio-button watir

Watir上的cheatsheets和docs显示了这样的设置单选按钮

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

如何根据旁边的文字选择单选按钮

有时这个文本在label标签内,有时它只是在一些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>

2 个答案:

答案 0 :(得分:2)

Orde关于使用输入元素属性的评论是一个好主意,因为它是最容易编程的。但是,要回答这个问题:

示例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. 的输入元素
  3. 以下文字节点 - 即[1]
  4. 有文字“MALE”或“FEMALE”,忽略了前导/后续空格 - 即[normalize-space(.) = "FEMALE"]
  5. 示例2 - 标签文字

    在此示例中,复选框具有正确关联的标签元素 - 即复选框的ID与标签的for属性匹配。 Watir支持通过:label定位器的标签文本定位元素:

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

    示例 - 首先跟随非空文本节点

    如果您想要一个适用于这两个示例的单一解决方案,以下似乎可行:

    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]部分)的复选框之后找到第一个文本节点,并且该文本与预期文本([normalize-space(.) = "UNDER 16"部分)匹配。

答案 1 :(得分: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

“第二类型”/周围是由于HTML中的一些奇怪的换行符,可能仅使用引号。