LoginSignup
53
32

More than 5 years have passed since last update.

Seleniumでタグに囲まれた文字列を.textで取得すると空文字が返ってくる

Last updated at Posted at 2018-08-14

背景

Webブラウザの自動操作をするために、タグで囲まれた文字列をtextメンバで取得しようとしたのですが、
下記の実装例のように実装すると、"TEXT1" という文字列が取得できず、空文字が返ってきました。
少しハマったので、文字列"TEXT1"を取得するための方法についてメモします。

環境

  • Ubuntu 16.04
  • Google Chrome 68
  • ChromeDriver 2.41.578700
  • Python 3.5.2 (恐らくPythonのversionは関係ない)

問題の実装例

HTML
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Test</title>
</head>

<body>
    <div id="text1" style="display: none">TEXT1</div>
    <div id="text2">TEXT2</div>
</body>

</html>
Python
from selenium import webdriver


driver = webdriver.Chrome("./chromedriver")
url = "呼び出したいURL"

driver.get(url)

text1 = driver.find_element_by_id("text1").text
text2 = driver.find_element_by_id("text2").text
print(text1)
print(text2)
出力結果


TEXT2

※ print(...)で出力しているので、"TEXT2"の上部は1行空行が入ります。

原因

<div id="text1" style="display: none">TEXT1</div>

のようなCSSプロパティがdisplay: noneのタグに対して、

text1 = driver.find_element_by_id("text1").text

のように.textで取得しようとすると、空文字が返ってくる仕様のようです。
他にも、CSSプロパティがvisibility: hiddenであっても同様の現象に遭遇します。
※ まだあるかも。

[2018/08/16 追記]

下記のような画面上に存在しないものは、「無いもの」として扱われるので、文字列は取得できないとのこと。
(@Luice さん、ご教授ありがとうございます。)
コメント原文はこちら

  • display:noneやvisibility:hiddenで表示されていないもの
  • カルーセルで表示されていないもの
  • ブラウザのWindow表示枠の外にあるもの(スクロール可の場合は除く) のようにソース上は存在しているが、表示されていないもの

解決方法

text1 = driver.find_element_by_id("text1").get_attribute("textContent")

のように、 .get_attribute("textContent")に変えると解決しました。

検証例

HTML
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Test</title>
</head>

<body>
    <div id="text1" style="display: none">TEXT1</div>
    <div id="text2">TEXT2</div>
    <div id="text3" style="visibility: hidden">TEXT3</div>
</body>

</html>
python
from selenium import webdriver

driver = webdriver.Chrome("./chromedriver")
url = "呼び出したいURL"

driver.get(url)

text1 = driver.find_element_by_id("text1").text
text2 = driver.find_element_by_id("text2").text
text3 = driver.find_element_by_id("text3").text
print(text1)
print(text2)
print(text3)
print("---")
textcontent1 = driver.find_element_by_id("text1").get_attribute("textContent")
textcontent2 = driver.find_element_by_id("text2").get_attribute("textContent")
textcontent3 = driver.find_element_by_id("text3").get_attribute("textContent")
print(textcontent1)
print(textcontent2)
print(textcontent3)
出力結果


TEXT2

---
TEXT1
TEXT2
TEXT3
53
32
3

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
53
32