2017-11-02 3 views
0

xpath axesメソッドを使うと時々間違ったノードが返ってくることに気付きました。xpath-axesメソッドが間違ったノードを返す

URL:私は2つの例を持っている "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" 軸法により3つのimg要素を選択することができます。しかし、私が "// td // following-sibling :: img"を使うと、2番目と3番目のimg要素を返すことができます。私の知る限りでは、子供と兄弟は別の2つのことですから、なぜこれが起こりますか?

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' rt-grid-12 rt-alpha rt-omega ')] // parent :: div "の場合、self要素とその子div要素はすべて親としてカウントされます。

これは私に混乱の原因が多いので、私を助けてください。

+0

最初のケースの正しいxpathには、td - '// td/following-sibling :: img'の後にスラッシュが1つだけ必要です。それは何も返しません。先生は、このような行動を2つのスラッシュで説明してくれることを願っています。 – splash58

答えて

1

XPathパーサーが間違ったノードを返すという提案は、なぜそれが何を返すのか分からないという誤った考え方から始まっています。 XPathパーサーの信頼性が低いことが分かっている場合を除いて、それが正しいと想定し、あなたの期待が間違っていることを前提にしてください。次に仕様に行き、あなたが書いた表現の意味論を研究してください。

あなたは

//td//following-sibling::img 

はそうあなたが正確に何をしている、すべてのtdのノードのすべての子孫の以下のすべての兄弟を求めている

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

の略称であることがわかりますが得ている。

「/」の代わりに「//」と覚えている人は、魔法の妖精のようなものです。しないでください:仕様を読んでください。

+0

しかし、次の兄弟はですか?私が知っている限り、先行兄弟はありませんか?どこが間違っていますか? – splash58

+0

最初の画像ではなく、2番目と3番目の画像のみが返されたとお伝えしました。しかし、ソース文書から空白テキストノードを取り除かなかった場合、最初の画像の前の空白もノードであり、最初の画像はその次の兄弟です。 –

+0

はい、毎回空白がテキストノードであることを忘れてしまった:) – splash58

関連する問題