🐙

SeleniumのgetTextは要素が存在していても空文字を返却することがある

2022/03/05に公開

WebDriverWaitを利用して、要素の表示を待機していてもgetTextは空文字を返却することがあります。

<div id="add-to-cart-button">カートに入れる</div>
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("add-to-cart-button")));
WebElement element = driver.findElement(By.id("add-to-cart-button"));
//空文字 "" が返却される
System.out.println(element.getText());
//"カートに入れる" が返却される
System.out.println(element.getAttribute("innerText"));

//"カートに入れる" が返却される(推奨)
System.out.println(element.getAttribute("textContent"));

ほとんどの場合でgetTextは正常に返却しますが
楽天の商品ページのように、縦に長いページでディスプレイ範囲内に無い場合は空文字を返却することがあるようです。

getTextで確実に取得したい場合はスクロールさせてブラウザの描画領域に持ってくる必要がある

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

scrollIntoViewではなくActionsを使ってスクロールさせる方法もありますが、こちらも期待通りに動作しないことが多いです。

Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

https://stackoverflow.com/questions/20888592/gettext-method-of-selenium-chrome-driver-sometimes-returns-an-empty-string

https://kellegous.com/j/2013/02/27/innertext-vs-textcontent/

Discussion