9
12

More than 3 years have passed since last update.

Selenium で要素のテキストが取得できないときの対処法

Last updated at Posted at 2020-01-05

スクレイピングによくつかうSeleniumで、うまく要素のテキストが取得できないときの対策方法

ハマりやすいポイント
- クラス名にスペースが含まれている
- クラス名はあっているのにテキストが取得できない

今回は、この2つのポイントについて対処法をまとめます。

 クラス名にスペースが含まれている場合

JavaScriptであれば、スペースが含まれていても

document.getElementByClassName("class name").innerText;

のように、そのままクラス名を記述するだけで、
指定したクラス名のテキスト要素は簡単に取得できます。
それをSeleniumで代替する場合は、

WebDriver.findElement(By.cssSelector("div[class='class name']")).getText().toString();

のようにBy.cssSelectorを使って、
WebDriver.findElement(By.cssSelector("{タグ名}[class='{クラス名}']"))で指定するとうまくテキスト要素が取得できます。

次にクラス名は合っているのにテキストが取得できない場合

Seleniumで取得できる要素のタグの種類が明確には調べていませんが、
主にdiv,a,table,tr,tdに限られていて
spanタグやbタグその他の要素を特定するにはXpathで要素を直接指定するか、
取得したい要素の親要素でdivタグの要素のクラス名を指定して、取得が可能になります。

<div class="div_class_name">
    <b class="b_class_name">
        <span class="span_class_name">取得したいテキスト</span>
    </b>
</div>

この場合、divタグのクラス名 "div_class_name"を利用してテキストの取得が可能です。

Xpathを用いる場合は、
Chromeの開発ツールを使って、要素にマウスがフォーカスしている状態で
右クリック→ [Copy] → [Copy XPath]
でXPathが取得できるので、

image.png

WebDriver.findElement(By.xpath("{xpath}")).getText();

でテキストを取得できます。

以上です。

それと記事のテーマとは逸れますが、
JavaScriptとSeleniumではスクロール処理が微妙に食い違うところがあるので、
その点も注意が必要ですね。

JavaScriptではうまく取得できてもSeleniumだとたまに期待通りに動作しないときがあるので、
最悪、Javaコードの中にJavaScriptコードを埋め込んで稼働させることも可能なので、
それさえ知っておけば大丈夫です!

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12