2016-08-14 9 views
2

PHP의 Simple HTML DOM Parser (SHDP)을 사용하여 요소에 액세스하는 데 익숙하지만, 이제는 watir-webdriver와 함께 루비를 사용하고 있으며, 페이지에서 요소에 액세스 할 때 SHDP의 기능을 대체 할 수 있는지 궁금합니다. .watir-webdriver를 사용하여 DOM (어린이/형제)를 트래버스하는 방법은 무엇입니까?

그래서 SHDP에서 나는이 작업을 수행 할 것 : id=foodiv의 모든 인스턴스의 배열이

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

합니다. 아, $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의 자식 후 나는 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 스크립트로 파이프하는 방법을 찾아 내야하고, 어떻게 든 그것을 관련 정보가 포함 된 루비로 가져와야합니다 ...

+0

문서/참고 자료는 도움이 될 것입니다. – Forwarding

답변

2

Watir과 당신이 알고있는 경우, 7 아이의 텍스트는 단순히 XPath를 통해 요소를 찾을 수 HAPPINESS 될 것입니다 다음을 구현합니다 : 색인 기능 (0부터 시작) :

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 
https://github.com/watir/watir/pull/270

참고 일반적으로 당신이 컬렉션을 사용하여 인덱스를 사용하여 선호해야하지만이 또한 작동하는지 :

next_sibling 현재 구현되지 않은 previous_sibling, 당신이 당신의 코드에 필요하다고 생각하는 경우 여기에 코멘트를 확인하시기 바랍니다

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

David Shute의 답변에 titusfortner 님의 의견보기 – Forwarding

1

당신을 위해 이것을 할 수있는 .child 방법이 있다고 생각하지 마십시오. 당신이 항상 그 구조의 일곱 자식 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

[페이퍼 백 :] 텍스트에 액세스하려면 [this] (https://gist.github.com/anonymous/b759255a19e5fbf298e36fe66320d092)와 같은 내용은 어떻게됩니까? – Forwarding

+0

'@ browser.table (id : 'productDetailsTable'). tr.td. ???'형제는 형제를 다루는 방법을 알지 못하는 곳입니다. – Forwarding

+0

@ 포워딩 - 직접적인 형제 지원을 원할 경우 여기에서 부르십시오. https://github.com/watir/watir/pull/270 – titusfortner

1

어쩌면 내가 PHP에서하는 일을 정확히 알려주지 않을 수도 있습니다.

단계 : :

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