
Python + Selenium で input 要素から値を取得する際、従来は次のように書くことが多かったと思います。
value= element.get_attribute("value")
例外が発生しました: JavascriptException Message: Error from JavaScript: 'HTMLFormElement' は定義されていません。 File "C:\Users\*****\*****.py", line 300, in value= element.get_attribute("value")
そして、どのように修正すればよいのでしょうか?
この記事では、その原因と、最適な解決策である 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")
-
JavaScript の
element.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)
■ get_attribute と get_property の違いまとめ
| メソッド | 取得対象 | 特徴 |
|---|---|---|
| get_attribute("value") | HTML の 属性値 | Selenium 内部 JS 依存 → 新バージョンでエラーの可能性 |
| get_property("value") | DOM の プロパティ値 | ユーザー入力後の最新値を取得。最も安定 |
| execute_script(...) | JS 実行 | どんな状況でもほぼ確実に値が取れる最強手段 |
実務では、
-
get_property() を使う
-
取れないときだけ execute_script()
という2段構えがおすすめです。