【问题标题】:How to use watir-webdriver to find element by class and text如何使用 watir-webdriver 按类和文本查找元素
【发布时间】:2016-02-02 18:47:53
【问题描述】:

我有以下 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>

我正在尝试查找以下&lt;td&gt;

<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

他们都返回了错误的单元格。

编辑: 元素的数量可能不同。顺序也可能不同。 我几乎需要找到 class 是 test1 并且 class 不是 test2 并且文本是 2 的元素。

编辑2: 我添加了更多课程,因为它不限于一两个课程。可能更多。

编辑3: 类的顺序可能不同:

<td class="test2 test1 test3">2</td>

Edit4:TD 必须有 test1,不能有 test2,必须有 text 2

【问题讨论】:

  • b.td(:class =&gt; /^test1$/, :text =&gt; "2").click
  • 询问时,请不要使用“嗨”等称呼、“谢谢”或“请帮助”等告别词或签名。 Stack Overflow 不是 BBS 或讨论论坛,我们正在创建参考书;请求帮助不是必需的——提出一个好的问题,你会得到帮助,因为这就是我们来这里的目的。它可能不会像您希望的那样迅速收到,但您的紧迫性不是我们的。阅读catb.org/esr/faqs/smart-questions.html,因为它充满了很好的信息。
  • @the Tin Man 我会记住这一点。谢谢。
  • @mudasobwa 我已经更新了这个问题。可能有不止一个类,顺序也可能不同。谢谢。
  • 那么是什么让这个单元格与众不同?它具体没有类 test2?

标签: ruby watir-webdriver


【解决方案1】:

更新后,如果您正在寻找带有 test 2 且没有 class test2 的单元格,您应该在 class 上使用此正则表达式:

b.td(:class => /^((?!test2).)*$/, :text => "2").click

更新:

为了要求匹配 test1 但省略 test2,我更新了正则表达式:

b.td(:class => /^((?!test2).)*test1((?!test2).)*$/, :text => "2").click

【讨论】:

  • Dane,我已经更新了这个问题。每个元素可能不止一个类。谢谢。
  • 戴恩,这看起来不错。它做了这个特殊情况需要做的事情。但在这种情况下它会失败: 2 因为它没有指定 test1
  • 那么它必须有测试2,必须有类“test1”并且必须省略类“test2”?您应该更新问题以指定这一点。
  • 这样就完成了。非常感谢。
  • 这在&lt;td class="test1 test4"&gt;2&lt;/td&gt; 出现在&lt;td class="test1"&gt;2&lt;/td&gt; 之前的页面上的情况下似乎不起作用。它将单击类test1 test4td,而不是类完全等于test1td。但很难确定@Andrey 要求的是什么。
【解决方案2】:

我建议尽可能避免使用正则表达式,它的执行速度非常慢。这更具可读性和灵活性,并且可能会减少电汇(即更快):

elements = b.tds(class: 'test1', text: '2')
element = elements.find { |td| !td.attribute_value('class').include?('text2') }
element.click

【讨论】:

    【解决方案3】:
    b.td(:class => "test1", :text => "2").click
    

    应该可以解决问题。

    我对此进行了测试,但由于某种原因,没有包含 &lt;table&gt; 标记,watir 无法识别 &lt;td&gt; 元素的 html。所以添加之后,这行得通。

    【讨论】:

    • 至少对我来说,这似乎点击了第一个 td 和文本 2(即&lt;td class="test1 test2"&gt;2&lt;/td&gt;),这不是需要的。
    • 这不起作用。它确实单击了错误的元素。谢谢。
    • 你应该分享更多的html。这个故事显然比你所展示的要多。 a 标签到底在哪里?这是一个javascript链接?您没有显示任何内容。
    【解决方案4】:

    我认为这对你有用:

    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,其类包含test1,但不包含test2,并且文本等于2。正如您在对 Dane Andersen 的回答的评论中提到的那样,点击的 td 不应该超过 1 个。

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 2015-11-07
      • 1970-01-01
      • 2018-01-25
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      相关资源
      最近更新 更多