php - 如何使用 watir-webdriver 遍历 DOM(子级/兄弟级)?

标签 php ruby dom html-parsing watir-webdriver

我习惯使用PHP的Simple HTML DOM Parser (SHDP)来访问元素,但我现在使用 ruby​​ 和 watir-webdriver,我想知道这是否可以取代 SHDP 的功能来访问页面上的元素。

所以在 SHDP 中我会这样做:

$ret = $html->find('div[id=foo]');

这是带有 id=foodiv 的所有实例的数组。哦,$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 遍历能力:

enter image description here

我问这个问题是因为如果 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_siblingprevious_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/

相关文章:

php - 依赖 HTML 'required' 进行简单的表单验证

PHP——如何从表中选择随机但不同的行

php - 循环遍历 PHPExcel 中的列和行以创建对象

ruby - bundler : failed to load command: rspec

javascript - 通过 DOM 函数附加新元素,还是使用 HTML 标签附加字符串,哪个更好?

php - 在循环中的 php mysql 记录插入期间日期 22 个月递增

ruby - 如何将可选参数传递到 Ruby 方法中?

ruby-on-rails - active_admin 目录中的常量警告重新声明

javascript - 在 URL 中转义 Base64 字符串?

javascript - 删除带有类名的 div