2012-05-30 17 views
6

私はセレクションを使用して、xpathを使用して自分のWebページにテキストを表示しています。セレンのwebdriver(xpath)を使用してテキストを読む

次のようにページのタグ構造がある -

<span id="data" class="firefinder-match"> 
    Seat Height, Laden 
    <sup> 
    <a class="speckeyfootnote" rel="p7" href="#">7</a> 
    </sup> 
</span> 

私は次のコードを使用している場合 -

driver.findElement(By.xpath("//span[@id='data']")).getText(); 

を私は= Seat Height, Laden 7

結果を得るしかし、私は読んでないようにしたいです<sup>タグ内のテキストと 結果を得るSeat Height, Laden

希望の結果を得るために使用できるxpath式を教えてください。

+3

Um。単純なXPath(WebElementsだけでなく、Stringを返すことができる)では、// span [@ id = 'data']/text()[1] 'を実行できます。私が考えることのできる1つの解決策はJSを使用し、2番目の方法はテキスト全体を取得してから、子要素からすべてを削除します。どちらの解決策もかなり醜いので、私はより良いものを見たいと思っています。とにかく、合理的な短時間で回答がない場合、私はそれを投稿します。 –

+1

xpathがあなたの唯一のオプションである理由は何ですか? Webdriverは、xpathによって要素を見つけるのに最も長い時間を要します。 – Amey

+0

私はそれに慣れているので、私はxpathだけを使用します。私の問題を解決する他の方法があれば、私は感謝します。 –

答えて

7

Seleniumでこれを行う方法はわかりません。私のJSソリューションがあります。アイデアは、要素のすべての子(テキストノードを含む)を取得し、次にテキストノードのみを選択することです。余分なスペースを取り除くために、.trim()(またはJS相当の)呼び出しを追加する必要があるかもしれません。

全体コード:

WebElement elem = driver.findElement(By.id("data")); 
String text; 
if (driver instanceof JavascriptExecutor) { 
    text = ((JavascriptExecutor)driver).executeScript(
      "var nodes = arguments[0].childNodes;" + 
      "var text = '';" + 
      "for (var i = 0; i < nodes.length; i++) {" + 
      " if (nodes[i].nodeType == Node.TEXT_NODE) {" + 
      "  text += nodes[i].textContent;" + 
      " }" + 
      "}" + 
      "return text;" 
      , elem); 
} 

そして、読みやすくするためだけのJS。

var nodes = arguments[0].childNodes; 
var text = ''; 
for (var i = 0; i < nodes.length; i++) { 
    if (nodes[i].nodeType == Node.TEXT_NODE) { 
     text += nodes[i].textContent; 
    } 
} 
return text; 
+0

JSを通じて結果を得るにはちょっといい解決策です。しかし、私は何かがあるかどうか尋ねたい!特定のタグを無視できるxpathの演算子。 –

+1

はい、あります。ただし、外部要素を選択していて、すべての子要素がデフォルトで含まれているため、この特殊なケースでは機能しません。テキストノードもそれの子要素であり、通常のパーサーがそれを得ることができます。 WebDriverは通常のパーサではなく、この機能を備えていません。それでも。特定のXPathを知りたい場合は、お気軽にお問い合わせください。 –

関連する問題