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>
答案 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]
[normalize-space(.) = "FEMALE"]
示例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中的一些奇怪的换行符,可能仅使用引号。