如何使用 watir-webdriver 通过 class 和文本查找元素
How to use watir-webdriver to find element by class and text
我有以下 HTML:
<td class="test1 test3">1</td>
<td class="test1 test2 test3">1</td>
<td class="test1 test2 test3">2</td>
<td class="test4 test3">2</td>
<td class="test1 test3">2</td>
<td class="test1 test3">3</td>
<td class="test1 test2 test3">3</td>
我正在尝试查找以下内容 <td>
:
<td class="test1">2</td>
这是我目前尝试过的方法:
b.td(:class => /(?!.*\btest2\b)/, :text => "2").click
b.td(:class => /^(?!.*\btest2\b)/, :text => "2").click
b.td(:class => /^(?!test2)/, :text => "2").click
b.td(:class => "test1", :class => /(?!test2)/, :text => "2").click
全部return单元格错误。
编辑:
元素的数量可能不同。顺序也可能不同。
我几乎需要找到 class 是 test1
且 class 不是 test2
且文本是 2
.
的元素
编辑2:
我添加了更多 classes,因为它不限于一个或两个 classes。可能更多。
编辑3:
classes 的顺序可能不同:
<td class="test2 test1 test3">2</td>
Edit4: TD 必须有测试 1,不能有测试 2,必须有文本 2
b.td(:class => "test1", :text => "2").click
应该可以解决问题。
我对此进行了测试,但出于某种原因,如果没有包含 <table>
标记,watir 无法识别 <td>
元素的 html。所以在添加之后,这有效。
更新后,如果您要查找带有测试 2 而没有 class 测试 2 的单元格,您应该在 class:
上使用此正则表达式
b.td(:class => /^((?!test2).)*$/, :text => "2").click
更新:
为了要求匹配 test1 但省略 test2,我更新了正则表达式:
b.td(:class => /^((?!test2).)*test1((?!test2).)*$/, :text => "2").click
我认为这对你有用:
td_array=b.tds.to_a
td_array.each do |td|
if td.class_name =~ /test1/ && td.class_name !~ /test2/ && td.text == '2'
b.td(:index, td_array.index(td)).click
end
end
这将点击页面上的每个 td
,其中 class 包含 test1
,不包含 test2
,并且文本等于 2
。正如您在对 Dane Andersen 的回答的评论中提到的那样,点击的 td
不应超过 1 个。
我建议尽可能避免使用正则表达式,它的执行速度很慢。这更具可读性和灵活性,并且可能会减少线路调用(即更快):
elements = b.tds(class: 'test1', text: '2')
element = elements.find { |td| !td.attribute_value('class').include?('text2') }
element.click
我有以下 HTML:
<td class="test1 test3">1</td>
<td class="test1 test2 test3">1</td>
<td class="test1 test2 test3">2</td>
<td class="test4 test3">2</td>
<td class="test1 test3">2</td>
<td class="test1 test3">3</td>
<td class="test1 test2 test3">3</td>
我正在尝试查找以下内容 <td>
:
<td class="test1">2</td>
这是我目前尝试过的方法:
b.td(:class => /(?!.*\btest2\b)/, :text => "2").click
b.td(:class => /^(?!.*\btest2\b)/, :text => "2").click
b.td(:class => /^(?!test2)/, :text => "2").click
b.td(:class => "test1", :class => /(?!test2)/, :text => "2").click
全部return单元格错误。
编辑:
元素的数量可能不同。顺序也可能不同。
我几乎需要找到 class 是 test1
且 class 不是 test2
且文本是 2
.
编辑2: 我添加了更多 classes,因为它不限于一个或两个 classes。可能更多。
编辑3: classes 的顺序可能不同:
<td class="test2 test1 test3">2</td>
Edit4: TD 必须有测试 1,不能有测试 2,必须有文本 2
b.td(:class => "test1", :text => "2").click
应该可以解决问题。
我对此进行了测试,但出于某种原因,如果没有包含 <table>
标记,watir 无法识别 <td>
元素的 html。所以在添加之后,这有效。
更新后,如果您要查找带有测试 2 而没有 class 测试 2 的单元格,您应该在 class:
上使用此正则表达式b.td(:class => /^((?!test2).)*$/, :text => "2").click
更新:
为了要求匹配 test1 但省略 test2,我更新了正则表达式:
b.td(:class => /^((?!test2).)*test1((?!test2).)*$/, :text => "2").click
我认为这对你有用:
td_array=b.tds.to_a
td_array.each do |td|
if td.class_name =~ /test1/ && td.class_name !~ /test2/ && td.text == '2'
b.td(:index, td_array.index(td)).click
end
end
这将点击页面上的每个 td
,其中 class 包含 test1
,不包含 test2
,并且文本等于 2
。正如您在对 Dane Andersen 的回答的评论中提到的那样,点击的 td
不应超过 1 个。
我建议尽可能避免使用正则表达式,它的执行速度很慢。这更具可读性和灵活性,并且可能会减少线路调用(即更快):
elements = b.tds(class: 'test1', text: '2')
element = elements.find { |td| !td.attribute_value('class').include?('text2') }
element.click