我遇到了一个问题,我认为问题在于我的page.all是如何拉出单选按钮问题的。
所以这里是表格的HTML(多个问题,5个单选按钮选项):
<table class="table table-striped table-stuff table-collapsible">
<colgroup>
<thead>
<tbody>
<input id="0_answer_question_id" value="9966" name="response[answers][0][answer_id]" type="hidden">
<tr>
<td class="heading">
<td class="option">
<div class="radio-inline radio-inline--empty">
<input id="question_1_1" value="1" name="response[answers_attributes][0][answer_opinion]" type="radio">
<label for="question_1_1">Strongly Disagree</label>
</div>
</td>
<td class="option">
<td class="option">
<td class="option">
<td class="option">
</tr>
<input id="response_1_question_id" value="9966" name="response[answers_attributes][1][answer_question_id]" type="hidden">
<tr>
<input id="response_1_id" value="<a number>" name="response[answers_attributes][1][id]" type="hidden">
<Same as above repeated 5 times with numbers changed>
</tbody>
</table>
我正在使用:
page.all('table.table-stuff tbody tr', minimum: 6).each do |row|
row.all("td label").sample.trigger('click')
end
获取每一行并从中选择一行。但是,我注意到“有时”一行不会选择一行。我的理论是“标题”(其中&lt; label&gt;本身也可以接受其中一次点击?)(因为根据我对page.all的工作方式的理解,它抓住了表格中的每个tbody tr
...但是也许是抓住标题?(因为它包含td label
?)
当一个表的名称类似于table table-striped table-stuff table-collapsible
时......你怎么知道实际的表“名称”是什么? (我没有写这个网站,只是为它做测试)。把它放在page.all('table.<etc>')
?
答案 0 :(得分:1)
如果标题td(在你的例子中未展开)也包含一个标签元素(因此它将包含在你的all
调用的结果中)那么你只需要更改CSS选择器就可以了不包括在内 - 比如
row.all("td.option label").sample.trigger('click') # only choose labels contined in tds with the class of 'option'
或
row.all("td:not(.heading) label").sample.trigger('click') # choose labels contained in tds without the class of 'heading'
关于关于表名的第二个问题,我真的不明白你在问什么。表没有名称属性,它们可以具有id属性或包含一些文本的标题,然后可以通过find(:table, 'id or caption text')
或within_table('id or caption text') { code to execute within scope of the table }
使用capybara查找它们。相反,您似乎在谈论元素上的类,这些类在CSS选择器中使用'。'指定。因此,将表元素与您列出的所有类匹配的CSS选择器将是 - 'table.table.table-striped.table-stuff.table-collapsible'
注意:如果您确定总共只有5个选项,则可以在您的查找中添加:count选项,以确保您的选择器仅查找这些项目
row.all("td.option label", count: 5).sample.trigger('click')