web-dev-qa-db-ja.com

SeleniumのgetText()メソッドchromeドライバーは時々空の文字列を返します

Selenium chrome driver getText() method(Java)は、同じ要素を持つ他の要素に対して空ではない文字列を返しますが、いくつかの要素に対して空の文字列を返すという奇妙なケースがありますxpath。ここにページの一部があります。

_<div __gwt_cell="cell-gwt-uid-223" style="outline-style:none;">
<div>Text_1</div>
<div>Text_2</div>
<div>Text_3</div>
<div>Text_4</div>
<div>Text_5</div>
<div>Text_6</div>
</div>
_

各内部タグについて、getTagName()getLocation()isEnabled()、およびisDisplayed()の有効な戻り値を取得できます。ただし、getText()は、一部のdivに対して空の文字列を返します。

さらに、mac chromeドライバーを使用する場合、getText()が空の文字列を返すのは常に 'Text_5'です。 Windows chromeドライバーを使用する場合、それはgetText()が空の文字列を返す「Text_2」です。 firefoxドライバーを使用する場合、getText()はすべてのdivから期待されるテキストを返します。

他に誰かがこの困難を抱えていましたか?

私のコードでは、このようなものを使用しています...

_ArrayList<WebElement> list = (ArrayList<WebElement>) driver.findElements(By.xpath(“my xPath here”));
for (WebElement e: list) System.out.println(e.getText());
_

以下に示すように、ここに私が使用している実際のxPathがあります。上記のページスニペットは、最後の2つのdivを扱います。

_//*[@class='gwt-DialogBox']//tr[contains(@class,'data-grid-table-row')]//td[contains(@class,'lms-assignment-selection-wizard-cell')]/div/div
_
38

更新:textContent属性はより良いオプションであり、ほとんどのブラウザでサポートされています。違いはこのブログ投稿で詳細に説明されています: innerText vs. textContent

別の方法として、innerText属性は、DOMに存在する要素のテキストコンテンツを返します。

_element.getAttribute("innerText")
_

isDisplayed()メソッドは、要素が実際には非表示ではなく、ビューポートの外側にある場合にトリップすることがあります。 getText()は、そのような要素に対して空の文字列を返します。

次のように、javascriptを使用してスクロールして要素をビューポートに移動することもできます。

_((JavaScriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);
_

getText()は正しい値を返す必要があります。

isDisplayed()メソッドの詳細は、このSOの質問:

Selenium WebDriverのisDisplayed()メソッドの仕組み

73
Faiz

WebElement.getAttribute( "value")が役立つはずです!!

5
sathish p

これは解決策ではないので、回答に含まれているかどうかはわかりませんが、コメントするには長すぎてリンクが含まれているので、回答します。

私もこの問題を抱えています。いくつかの掘り下げを行った後、画面に表示されていない要素のテキストを取得しようとすると問題が発生するようです(上記の@Faizのコメントのように)これは、要素がスクロールされていない場合、または下にスクロールすると、要素はドキュメントの上部近くにあり、スクロール後に表示されなくなります。要素のリストを取得するFindElements()呼び出しがあります。少なくともいくつかはおそらく表示されていません。これを確認するには、リスト内の各要素でboolean b = webElement.isDisplayed();を試して結果を確認します。 (この問題に関する1年前の非常に長い議論については here を参照してください。まだ解決策はありません。)

どうやら、これは意図的な設計上の決定です( here を参照)。非表示要素のgettextは空を返すことになっています。なぜ彼らがこれについて非常に堅いのか、私にはわかりません。テキストを取得またはスクロールする前に要素をクリックするなど、さまざまな回避策が提案されています。 (後者のコード例については上記のリンクを参照してください。)これらを試していないため、これらを保証することはできませんが、テキストを利用できるように要素を可視化しようとしているだけです。それがアプリケーションにとってどれほど実用的かはわかりません。それは私のものではありませんでした。何らかの理由で、FirefoxDriverにはこの問題がないため、私が使用しています。

申し訳ありませんが、より良い答えが得られません-おそらく issues page でバグレポートを提出すると、多くの人がそれが機能ではなくバグであることに気付くでしょう機能を変更します。

がんばろう! bsg

[〜#〜] edit [〜#〜]

考えられる回避策については、 この質問 を参照してください。 isDisplayedがtrueを返す場合、指定されたとおりに使用することはできませんが、問題の原因となっている要素がわかっている場合、またはテキストが通常空白ではなく、キャッチするために「if string is empty」条件を設定できる場合それが起こったとき、あなたはまだそれを試すことができます。残念ながら、それはすべての人にとってうまくいくわけではありません。

NEW UPDATE以下の答えを試したところ、うまくいきました。ありがとう、ファイズ!

3
bsg

element.getAttribute("innerText")は、getText()が空を返していたときに機能しました。

1

最近、同様の問題が発生しました。

メニュータブ「LIFE EVENTS」がスクロールボックスにあることを確認する必要がありました。問題は、多くのメニュータブがあり、残りのメニュータブを表示するには下にスクロールする必要があることです。したがって、私の最初の解決策は、目に見えるメニュータブではうまく機能しましたが、見えないものではうまくいきませんでした。

以下のxpathを使用して、Seleniumがスクロールボックス全体の親要素を指すようにしました。

@FindBy(xpath = "//div[contains(@class, 'menu-tree')]")
protected WebElement menuTree;

次に、増分できるWebElementsのリストを作成しました。メニュータブが表示されている場合、ソリューションは機能し、trueを返しました。しかし、メニュータブが見えない場合、falseを返しました。

public boolean menuTabPresent(String theMenuTab) {
    List<WebElement> menuTabs = new ArrayList<WebElement>();
    menuTabs = menuTree.findElements(By.xpath("//i/following-sibling::span"));

    for(WebElement e: menuTabs) {
        System.out.println(e.getText());
        if(e.getText().contains(theMenuTab)) {
            return true;
        }
    }
    return false;
}

2問題の解決策が見つかりましたが、どちらも同等に機能します。

    for(WebElement e: menuTabs) {
        scrollElementIntoView(e); //Solution 1
        System.out.println(e.getAttribute("textContent")); //Solution 2
        if(e.getAttribute("textContent").contains(theMenuTab)) {
            return true;
        }
    }
    return false;

ソリューション1は、以下のメソッドを呼び出します。その結果、Seleniumの実行中にスクロールボックスが物理的に下に移動します。

protected void scrollElementIntoView(WebElement element) {
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true)", element);
}

解決策2は、ポイントしている属性のテキストコンテンツ(現在表示されていないメニュータブの場合でも)を取得します。したがって、この状況で.getText()が実行できなかったジョブを適切に実行します。

1
Nick Gibbens

isDisplayedまたはスクロール位置を気にしない場合は、次のように書くこともできます。

String text = ((JavaScriptExecutor)driver).executeScript("return $(arguments[0]).text();", element);

またはjqueryなし

String text = ((JavaScriptExecutor)driver).executeScript("return arguments[0].innerText;", element);
1
Kambiz
for (int count=0;count<=sizeofdd;count++)
{       
   String GetInnerHTML=getddvalue.get(count).getAttribute("innerHTML");
}

ここで、1. getddvalueはWebElement 2. sizeofddはgetddvalueのサイズです

1
Nand

getText()に関連する問題もあり、解決しました。

WebElement errMsg;
errMsg = driver.findElement(By.xpath("//div[@id='mbr-login-error']"));
WebElement parent = driver.findElement(By.xpath("//form[@id='mbr-login-form']"));
List<WebElement> children = parent.findElements(By.tagName("div")); 
System.out.println("Size is: "+children.size());
//((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", children);
for(int i = 0;i<children.size();i++)
{
    System.out.println(i + " " + children.get(i).getText());
}
int indexErr = children.indexOf(errMsg);
System.out.println("index " + indexErr);
Assert.assertEquals(expected, children.get(indexErr).getText());

上記の解決策はどれも私にとってはうまくいきませんでした。

0
user4533396