【问题标题】:Watir: How do I find an element where the class of that element and the class of one of its parents identifies it?Watir:我如何找到一个元素,该元素的类及其父元素之一的类可以识别它?
【发布时间】:2013-01-31 23:30:19
【问题描述】:

我有类似的html

<div class="header"><div class="title">AAAAAAAAA</div></div>
<div class="body">
  <div class="card"><div class="xxx"><div class="yyy"><div class="title">AAAAAAAAA</div></div></div></div>
  <div class="card"><div class="xxx"><div class="yyy"><div class="zzz"><div class="title">BBBBBBBBB</div></div></div></div></div>
</div>

我需要做什么(通过 watir-webdriver)“给我一个带有“title”类和文本“AAAAAAAAA”的元素,它是一个带有“card”类的元素的子元素 em>”。在这个例子中,我想在第三行找到类 'title' 的 div。

说“给我带有文本'AAAAAAAAA'和'title'类的元素”是不够的,因为该元素可能存在于DOM中的其他地方。我必须能够通过它的属性和它的父母来识别它。

我不知道该怎么做,真的很喜欢一些建议。

在 watir-webdriver 中,如果我写:

b.element(:class => "card").element(:class => "title", :text => "BBBBBBBBB")

然后,据我所见,什么都找不到,因为 element(:class=> "card") 将匹配第 3 行的第一个卡片元素,然后匹配 BBB... 文本将失败,因为它唯一的 AAA...在第一张卡下可用。

我想做类似的事情

b.elements(:class => "card").each { |elem| ...etc }

找到我要的子元素,但是当我找到子元素时,我不能轻易使用它。例如,我希望能够调用可见?就可以了,但结果很难摆脱那个代码块。我可以有一个分配可见的局部变量吗?结果,或者我可以从块内抛出一个错误,但这并不是我真正想要的。

我真正追求的是:

b.elements(:class => "card").element(:class => "title", :text => "BBBBBBBBB").othermethods...

所以第一个方法调用查找所有具有卡片类的元素,然后在第二个方法中查找具有类“标题”和文本“BBBBBBBB”的卡片下的第一个元素。我知道一张卡片下只有一个元素具有“标题”类和文本“BBBBBBBBB”。

但是,此功能不存在。有没有一种简单的方法来实现同样的目标?我真的很感激这里的一些指导。提前致谢。

【问题讨论】:

    标签: html ruby watir-webdriver


    【解决方案1】:

    如果 Justin 或 Željko 为您想出更好的解决方案,我不会感到惊讶(如果他们这样做了,那么我想知道它是什么,我自己!),但这里有一些东西,虽然丑陋,但应该足够了:

    target_parent_div = b.divs(class: "card").find { |div| div.div(class: "title", text: "AAAAAAAAA").exists? }
    target_element = target_parent_div.div(class: "title", text: "AAAAAAAAA")
    

    ...然后使用target_element 来满足您的任何需求。

    【讨论】:

    • find 中的条件不正确。 div.div 将始终导致返回第一个 div。它必须是div.div.exists?。除此之外,我认为这是最简单的方法。
    • 如果是 div.div.exists?那么这不只是返回一个布尔值吗?我们如何让 Array 迭代器返回所需的 Watir 元素本身?
    • 对于您的第一个问题,您需要一个布尔值。 Enumerable#find "将枚举中的每个条目传递给块。返回第一个不为假的块。"。 div.div(class: "title", text: "AAAAAAAAA") 永远不会是假的,即使元素不存在(即你总是会得到第一个b.divs(class: "card")。因此为什么它需要是div.div(class: "title", text: "AAAAAAAAA").exists?。对于你的第二个问题,我不知道有什么办法。
    • 啊!啊!
    • 感谢 Abe 和其他所有人对此进行了仔细研究并提供了解决方案。那会做我需要的。你们真棒。再次感谢。
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 2017-12-17
    • 2018-08-30
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多