Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Python + Selenium】get_attribute("value") が新バージョンでエラーに!― 解決策は get_property() への置き換え ―

Python + Selenium で input 要素から値を取得する際、従来は次のように書くことが多かったと思います。

 

 
value= element.get_attribute("value")

 

 
しかし、Selenium の新しいバージョンにアップデートした途端、次のようなエラーが出てしまうケースが報告されています。

 

 
例外が発生しました: JavascriptException Message: Error from JavaScript: 'HTMLFormElement' は定義されていません。 File "C:\Users\*****\*****.py", line 300, in value= element.get_attribute("value")

 

 
古い Selenium では問題なく動いていたのに、なぜ新バージョンではエラーになるのでしょうか?

そして、どのように修正すればよいのでしょうか?

この記事では、その原因と、最適な解決策である get_property() への置き換えについて解説します。


■ なぜ get_attribute("value") がエラーになるのか?

Selenium 4 の後半以降、get_attribute() は内部で JavaScript を実行して属性値を取得する方式に変更されました。

ところがこの内部実装が原因で、

  • ページ側の JavaScript と衝突

  • Shadow DOM や動的要素の扱い

  • ブラウザ(特に Edge)との組み合わせ

などによって、“HTMLFormElement が未定義” といった JavaScript の例外が発生するケースがあります。

つまり、あなたのコードが悪いのではなく、Selenium 側の内部処理が原因です。


■ 解決策①:get_property("value") を使う(最もおすすめ)

input の value を取りたい場合、最も安定していて Selenium が公式に推奨しているのは get_property() です。

▼ 置き換え例

変更前

 
value = element.get_attribute("value")

 

変更後

 
value = element.get_property("value")

 

 
▼ なぜ get_property() が良いのか?
  • JavaScriptelement.value と同じ動作

  • 入力後に動的に変わった値も正しく取れる

  • Selenium の内部 JavaScript を使わないので今回のようなエラーの影響を受けない

  • 通常の input 取得として最も自然で正確

Selenium チームも「input value を取るなら property を使うべき」と明記しています。


■ 解決策②:JavaScriptを直接実行(より強力)

サイト側のフレームワーク(React, Vue, Angular)が value を独自管理している場合など、get_property() でも取得できない時があります。

その場合は JavaScript を直接実行する方法が最も確実です。

 

 
value = driver.execute_script("return arguments[0].value;", element)

 

 
これは Selenium の内部実装を完全にスキップし、ブラウザに直接アクセスします。

■ get_attribute と get_property の違いまとめ

メソッド 取得対象 特徴
get_attribute("value") HTML の 属性値 Selenium 内部 JS 依存 → 新バージョンでエラーの可能性
get_property("value") DOM の プロパティ値 ユーザー入力後の最新値を取得。最も安定
execute_script(...) JS 実行 どんな状況でもほぼ確実に値が取れる最強手段

実務では、

  1. get_property() を使う

  2. 取れないときだけ execute_script()

という2段構えがおすすめです。