如何使用 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