2017-07-21 2 views
2

私が最近テストしているアプリケーションではAngular 4が更新されましたが、現在はテキストで一致できないcertian要素があります。ここapplicaitionの小さなHTMLのsnipitです:このxpathが目的の要素を見つけられないのはなぜですか?

 <!----><div _ngcontent-c14="" class="form-group row"> 
      <label _ngcontent-c14="" class="col-2 col-form-label" for="example-text-input">Lift Pump Relay</label> 
      <div _ngcontent-c14="" class="col-10"> 
       <div _ngcontent-c14="" ngbdropdown="" class="dropdown"> 
        <button _ngcontent-c14="" aria-haspopup="true" class="btn btn-secondary dropdown-toggle" ngbdropdowntoggle="" aria-expanded="false">Selected: Off</button> 
        <div _ngcontent-c14="" class="dropdown-menu"> 
         <!----><button _ngcontent-c14="" class="dropdown-item"> On 
         </button><button _ngcontent-c14="" class="dropdown-item"> Off 
         </button><button _ngcontent-c14="" class="dropdown-item"> Toggle 
         </button> 
        </div> 
       </div> 
      </div> 
     </div> 


     <div _ngcontent-c14=""> 
      <!----> 
      <!----> 
      <!----> 
     </div> 

     <!----> 
     <!----> 

     <!----><div _ngcontent-c14="" class="wi-actuator-control-buttons"> 
      <button _ngcontent-c14="" class="btn btn-secondary"> 
       <i _ngcontent-c14="" class="fa fa-times"></i> Exit 
      </button> 
      <!----><button _ngcontent-c14="" class="btn btn-secondary"> 
       <i _ngcontent-c14="" class="fa fa-gears"></i> Start 
      </button> 
      <!----> 
     </div> 

    </div> 

私はそうのようなテキストを使用してオン/オフ/トグルボタンにアクセスできるようにしています:

//button[contains(text(), 'On')] //using the on button in this example

が、いくつかのために開始ボタンと終了ボタンではこれがうまくいかない理由は次のとおりです。

//button[contains(text(), 'Exit')] //using Exit for this example

これはアプリの周りの多くの場所でのケースで、ボタン内にネストされている "i"要素に関連しているようです。 (例えばExitボタンには<i _ngcontent-c14="" class="fa fa-times"></i>がネストされています)その "i"要素がボタンに存在すると、テキストで要素を一致させることはできません。

これはなぜ起こっているのですか?

(それは文字通り唯一のオプションでない限り)(単にCSSやjQueryのを使用するように私に教えないでください。それはこの質問が求めているものではありません)

+0

私は解決策を見つけました:もし私が '。'私のxpathには 'text()'の代わりに、例えば以下のように動作します:// button [text()[contains(。、 'Exit')]]私はまだこれがなぜなのか不思議です。 – switch201

答えて

3

をXPath 1.0の関数は、文字列を期待するが、ノードリストを供給されると最初の要素のみを使用します。

あなたの場合、終了ボタンには2つのtext()子があります(button/text()はノードリストを返します)。最初のものには空白のみが含まれているため、「終了」は含まれません。式をcontains(., 'Exit')に変更すると、ボタンはすべてのテキスト子孫を連結して文字列に変換されます。

+0

応答していただきありがとうございます。私は、このボタンに2つのtext()子があることをHTMLで調べるだけでどのように理解できるのでしょうか? – switch201

+1

@ switch201:[xsh](http://metacpan.org/pod/distribution/XML-XSH2/xsh)で試してみましたが、2つあることがわかります。「」の前に1つあります。 – choroba

関連する問題