2012-10-24 57 views
24

私はこのような隠された<div>のうちの一例文字列1000を読みしようとしている:Selenium WebDriverで隠し要素のテキストを読み取る方法は?

<div id="hidden_div" style="visibility:hidden">1000</div> 

私はWebElement.getText()はセレン2(webdriverを)の隠し要素に動作しないことを承知していますので、私は解決策を検索(like this one)と明らかに次のコードは動作するはずです:

WebElement hiddenDiv = seleniumDriver.findElement(By.id("hidden_div")); 
String n = hiddenDiv.getText(); // does not work (returns "" as expected) 
String script = "return arguments[0].innerText"; 
n = (String) ((JavascriptExecutor) driver).executeScript(script, hiddenDiv); 

をしかし、それは私のために動作しません、変数nは常にnullとして終わります。私は間違って何をしていますか?

答えて

19

編集:ああ、これは動作します。

String script = "return document.getElementById('hidden_div').innerHTML"; 

Firefoxで。

これも同様です。

String script = "return arguments[0].innerHTML"; 

純粋なJavascriptではうまくいきませんでした。ここで述べたとおり、 Jqueryでブラウザを起動します。 How to use JQuery in Selenium?以下のコードをスクリプトに使用してください。

String script = "return $('#hidden_div').text();"; 

これは機能します。

+6

セレンwebdriverをのFAQによると:「:なぜそれは隠し要素と対話することはできません A:?。ユーザーは隠し要素のテキストを読むことができないので、webdriverをも同様に、それへのアクセスを許可しません しかし、 Javascriptの実行機能を使用して要素から直接getTextを呼び出すことができます... " 私のアプリケーションはjQueryをベースに構築されて以来、jQueryも使用してしまいました。 FAQで表現されたこの決定の背後にある理由に同意するかどうか確かではありませんが、少なくとも隠れたテキストを取得する方法はあります。 –

+1

古いSeleniumバージョン(少なくとも2.25)では、隠し要素のテキストを取得することができました。新しいバージョン(少なくとも2.39)では、 'getText()'は要素が可視でない場合は空の文字列を返します。どちらの場合も、隠れ要素と対話するときの動作とは異なります。 'click()'や 'sendKeys(...)'を実行しようとすると、ElementNotVisibleExceptionが発生します。 –

+2

完全性のために:WebDriver FAQはhttps://code.google.com/p/selenium/wiki/FrequentlyAskedQuestionsに掲載されています。 – sleske

0

私は目に見えない要素を読み取るのと同じ問題に遭遇しましたが、私はWebElementオブジェクトを元に戻し、さらにテキストを解析する必要がありました。

このコードは私の要求を満たしています。

(WebElement) ((JavascriptExecutor) driver).executeScript(
    "arguments[0].style[\"display\"] = \"block\";"+ 
    "arguments[0].style[\"visibility\"] = \"visible\";"+ 
    "return arguments[0];", 
element); 
6

すでに与えられた回答の作業に基づいて、私はこのユーティリティメソッド(Java)を作成しました。たぶん、これは他の人にとっては役に立ちます。私はテキストノードを抽出するためにjQuery's text()を使用

public static String getText(WebDriver driver, WebElement element){ 
    return (String) ((JavascriptExecutor) driver).executeScript(
     "return jQuery(arguments[0]).text();", element); 
} 
  • 。 innerHTMLはHTMLタグも提供します。

    いくつかのケースでは、人はそれが役に立つかもしれません:私は要素を操作したり、それが視界

37

が同様に役に立つかもしれないですしていないnoConflict

  • の場合には代わりに$はjQueryを使用し
  • 要素のtextContent,innerTextまたはinnerHTML属性から取得できる隠しテキストを取得するには、element.attribute('attributeName')を呼び出します。

    element.getAttribute("textContent")私のために働いた。

    が詳細を参照してください - > http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/

  • +3

    悲しい、これは答えの人々です!私は上記の受け入れられた答えのjavascriptをしようとしていたが、これを試して、完全に動作します。とても清潔です。 –

    +1

    element.getAttribute( "textContent")。trim()は私に必要なものを正確に与えました。 – Bjinse

    +0

    良い答え! innerTextは複数の改行と空白を1つのスペースにまとめているのに対し、textContentはそうではないので、私はtextContentよりもinnerTextのほうがいいです。 – frodo2975

    0

    私は比較的セレンに新しい(そして全体としてのプログラミングに)んだけど、私はちょうど私のために働いたソリューションを共有しています。

    セレン2は、隠された可視性を持つ要素を直接処理するために設計されていませんでした。たとえば、IDまたはCSSセレクタを見つけることができません。

    私は多くのitensを持つHTMLテーブルを持っていたボットの状況がありました。その時にクリックすると、隠された可視性を持つドロップダウンが開かれました。それは別のフレームでさえあった。

    具体的な状況ですが、解決策が見つからないため、この(悪い)ものを選択しましたが、醜いコードにもかかわらず、一貫して機能します。

    まずはswitchToDesiredFrame(); - ここにdriver.switchTo.frame()ロジックを入力してください。

    より:

    WebElement table = driver.findElements(By.tagName("table")).get(index_1); 
    
    List<WebElement> dataCells= table .findElements(By.tagName("td")); 
    
    WebElement spceificDataCellIWanted = dataCells.get(index_2); 
    
    System.out.println(spceificDataCellIWanted.getText()); 
    

    dataCellsは文字通り<td>タグであり、それらは<td>年代は<table> 『コンテナ』の下にリストの要素と同じように、リストWebElementsなります。

    私はChromeとFirefoxで動作しましたが、ヘッドレスブラウザでは動作しませんでしたが、その理由は不明です。もしあなたがそのようなものに遭遇し、よりエレガントな解決策を(おそらくそれを見つけるのが難しくない)持っているなら、共有してください!

    0

    我々はそのようなケースに遭遇したとき、私たちが最初にすべきことは、その後、ドラッグなどのように、そのページ上の任意の変更をしない任意のアクションを試してみることです。この

     WebElement hiddenElement = GET YOUR ELEMENT HERE; 
         String hiddenContent= hiddenElement.getAttribute("textContent"); 
    
    -1
    type='hidden' 
    

    をお試しくださいフレームスイッチを行う。

    getText()を試しても問題が解決しない場合は、上記の2番目の方法を試してみてください。

    関連する問題