我习惯使用PHP的Simple HTML DOM Parser (SHDP)来访问元素,但我现在使用 ruby 和 watir-webdriver,我想知道这是否可以取代 SHDP 的功能来访问页面上的元素。
所以在 SHDP 中我会这样做:
$ret = $html->find('div[id=foo]');
这是带有 id=foo
的 div
的所有实例的数组。哦,$html
是指定 URL 的 HTML 源代码。不管怎样,我会把它放在一个循环中:
foreach($ret as $element)
echo $element->first_child ()->first_child ()->first_child ()->first_child ()->first_child ()->first_child ()->first_child ()->plaintext . '<br>';
现在,这里的每个 ->first_child()
都是带有 id=foo
的父级 div
的子级(请注意,我有七个)然后我打印第七个 child 的明文。像这样的事情
<div id="foo">
<div ...>
<div ...>
<div ...>
<div ...>
<div ...>
<div ...>
<div ...>HAPPINESS</div>
</div>
</div>
</div>
</div>
</div>
</div
</div>
会打印出“HAPPINESS”。所以,我的问题是,如何使用 watir-webdriver 来完成此操作(如果可能的话)?
另外,更一般地说,我如何在 watir-webdriver 中获得 SHDP 的 DOM 遍历能力:
我问这个问题是因为如果 watir-webdriver 不能做到这一点,我将不得不找到一种方法将 watir-webdriver 中的浏览器实例的源代码通过管道传输到使用 SHDP 的 PHP 脚本并以这种方式获得它,并以某种方式将其带回 ruby 并提供相关信息...
最佳答案
Watir 实现了 :index 功能(从零开始):
browser.div(id: 'foo').divs # children
browser.div(id: 'foo').div(index: 6) # nth-child
browser.div(id: 'foo').parent # parent
browser.div(id: 'foo').div # first-child
browser.div(id: 'foo').div(index: -1) # last-child
next_sibling
和 previous_sibling
目前尚未实现,如果您认为您的代码有必要,请在此发表评论:https://github.com/watir/watir/pull/270
请注意,一般来说,您应该更喜欢使用索引而不是使用集合,但这些也可以:
browser.div(id: 'foo').divs.first
browser.div(id: 'foo').divs.last
平装本代码示例(您想要通过文本选择还是获取文本?):
browser.li(text: /Paperback/)
browser.td(class: "bucket").li
browser.table(id: 'productDetailsTable').li
我们过去也曾收到过支持诸如直接子代之类的请求,而不是解析所有后代:https://github.com/watir/watir/issues/329
我们正在积极研究如何改进 Watir 即将推出的版本中的功能,因此,如果此解决方案不适合您,请在此处发布一条建议,其中包含您理想的语法以实现您想要的功能:https://github.com/watir/watir/issues我们将看看如何支持它。
关于php - 如何使用 watir-webdriver 遍历 DOM(子级/兄弟级)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38939160/