背景
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