2016-08-14 36 views
2

我习惯于使用PHP的Simple HTML DOM Parser(SHDP)来访问元素,但我现在使用的是与watir-webdriver的ruby,我想知道这是否可以取代SHDP的功能,只要访问网页上的元素。如何使用watir-webdriver遍历DOM(子/姐妹)?

所以在SHDP我应该这样做:

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

这与id=foodiv一切都实例的数组。哦,$html是指定网址的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()是父divid=foo(请注意,我有七)一个孩子,然后我打印7日明文儿童。像这样的东西

<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 ...

+0

文档/参考将是伟大的。 – Forwarding

回答

2

的Watir实现:索引功能(零基):

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,我们将看到我们如何支持它。

+0

请参阅titusfortner对David Shute的回答的评论。 – Forwarding

1

I不要相信有一个.child方法可以为你做到这一点。如果你知道它总是会在结构7周孩子的div你可以做不雅

require 'watir-webdriver' 
@browser = Watir::Browser.new 
puts @browser.div(id: 'foo').div.div.div.div.div.div.div.text 

你总是可以抓住他们的集合,然后解决了最后一个,假设它是最后一个,最深的在堆栈。

puts @browser.div(id: 'foo').divs.last.text 

这样做也行得通,但是假设页面结构是绝对的。它也不等于上面的元素迭代。由于我不清楚这样做的价值,所以我不太愿意采取相同的代码。

+0

如何访问“Paperback:”文字?[https://gist.github.com/anonymous/b759255a19e5fbf298e36fe66320d092]? – Forwarding

+0

你会做'@ browser.table(id:'productDetailsTable')。tr.td。???'哪里'???'我不知道如何处理兄弟姐妹。 – Forwarding

+0

@Forwarding - 如果你想直接支持兄弟姐妹,请在这里点击:https://github.com/watir/watir/pull/270 – titusfortner

1

也许我没有完全给你你在做PHP的事情。但是,如果你知道七子的文本将是HAPPINESS,那么你可以简单地找到通过XPath的一个元素:

步骤:

Given(/^I click the div "(.*?)" xpath$/) do |div_xpath| 
    Watir::Wait.until { @browser.div(:xpath => div_xpath).exist? } 
         @browser.div(:xpath => div_xpath).click 
end 

特点:

Given I click the div "//div[@id='foo'][text()='HAPPINESS']" xpath 
+0

请尽量避免在Watir中使用XPath选择器。 Watir API几乎完全没有必要,阅读起来很糟糕。 :)如果你想匹配基于文本的元素,请使用:'@ browser.div(text:“HAPPINESS”)' – titusfortner