2017-11-02 5 views
0

xpath axes 메서드를 사용하면 때때로 잘못된 노드가 반환된다는 사실을 눈치 챘습니다.xpath - 축 메서드가 잘못된 노드를 반환합니다.

URL : 나는 두 가지 예제를 가지고 "http://demo.guru99.com/v1/"

<tr> 
    <td align="center"> 
     <img src="../images/1.gif"> 
     <img src="../images/3.gif"> 
     <img src="../images/2.gif"> 
    </td> 
</tr> 

나는 "// TD // 아이 : IMG"축 방법으로 세 가지 IMG 요소를 선택할 수 있습니다. 그러나 "// td // following-sibling :: img"를 사용하면 여전히 두 번째 및 세 번째 img 요소를 반환 할 수 있습니다. 제가 아는 한, 자녀와 형제는 서로 다른 두 가지입니다. 그렇다면 왜 이런 일이 발생합니까?

URL : http://demo.guru99.com/selenium/guru99home/

<div class="rt-grid-12 rt-alpha rt-omega" id="rt-feature"> 
    <div class="rt-grid-6 "> 
    <div class="rt-block"> 
     <h3> 
      Desktop, mobile, and tablet access</h3> 
     <ul> 
      <li> 
       <p> 
        Free android App</p> 
      </li> 
      <li> 
       <p> 
        Download any tutorial for free</p> 
      </li> 
      <li> 
       <p> 
        Watch video tutorials from anywhere&nbsp;</p> 
      </li> 
     </ul> 
     <p> 
      <a href="https:/play.google.com/store/apps/details?id=com.vector.guru99&amp;hl=en"><img alt="" src="images/app_google_play(1).png"></a></p> 
    </div> 
    </div> 
    <div class="rt-grid-5 "> 
    <div class="rt-block"> 
     <img src="images/logo_respnsivsite.png"><br> 
    </div>  
    </div>  
</div> 
여기

, 내가 사용하는 경우 "// DIV [ID = 'RT-기능'과 @ (@ 클래스 = 'RT-그리드-12 RT-알파 RT-오메가')] // following-sibling :: div "인 경우 자식 요소 여야하는 해당 div 요소는 여전히 형제로 집계됩니다.

"// div [@ id = 'rt-feature'및 (@ class = rt-grid-12 rt-alpha rt-omega ')] // parent :: div "인 경우, self 요소와 그 자식 div 요소는 모두 부모로 계산됩니다.

나 원인

이 많은 혼란, 저를 도와주세요.

+0

첫 번째 경우에 올바른 XPath는 TD 이후 단 하나의 슬래시가 있어야합니다 -'// TD/다음 - 형제 :: img'합니다. 아무것도 반환하지 않습니다. 전문가, 두 개의 슬래시로 그러한 동작을 설명 할 수 있기를 바랍니다. – splash58

답변

1

는 XPath 파서는 잘못된 사고 방식에서 시작, 그것은 무엇을 반환하는 이유를 이해하지 않고보다, 잘못된 노드를 반환 제안. XPath 파서가 신뢰할 수 없다는 것을 알지 못한다면, XPath 파서가 옳은지, 당신의 기대가 잘못되었다는 가정하에 시작하십시오. 그런 다음 스펙으로 이동하여 작성한 표현의 의미를 연구하십시오.

당신은

//td//following-sibling::img 

정확히 무엇이다, 그래서 당신은 모든 TD 노드의 모든 후손 다음의 모든 형제 자매를 요구 한

/descendant-or-self::node()/td/descendant-or-self::node()/following-sibling::img 

의 약자 것을 발견 할 것이다 당신 지고있다.

나는 습관적으로 대신에 "//"쓰는 사람 건너했습니다 "/"무슨 뜻인지한지 생각을하지 않고 마법의 요정 가루의 일종으로. 하지 말고 사양을 읽으십시오.

+0

그러나 다음 형제는 입니까? 나가 undestand까지, 선행 형제가 있지 않는가? 내가 어디서 잘못한거야? – splash58

+0

첫 번째 이미지가 아니라 두 번째 및 세 번째 이미지 만 반환되었다고 말씀하셨습니다. 그러나 원본 문서에서 공백 텍스트 노드를 제거하지 않은 경우 첫 번째 이미지 앞의 공백도 노드이고 첫 번째 이미지는 다음과 같은 형제입니다. –

+0

네, 매번 공백이 텍스트 노드임을 잊어 버렸습니다 :) – splash58