4

我有 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' 的元素的子元素”。在这个例子中,我想在第三行找到类 'title' 的 div。

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

我不确定如何做到这一点,并且真的很喜欢一些建议。

在 Watir-webdriver 中,如果我写:

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

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

我虽然想做类似的事情

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

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

我真正追求的是:

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

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

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

4

1 回答 1

3

如果 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用于您需要的任何东西。

于 2013-01-31T14:23:05.713 回答