StaleElementReferenceに対処したい
少し前進しました
★以降に追記しました
引き続きヒントを探してます
さらに前進しました
★★のクリア/入力/検証のスパルタフローで安定したっぽい
爆速
JavaScriptを排除したい
引き続きヒントを探してます
WebDriver制御のChromeで値の設定に苦戦しました
ひとまずJavaScriptで切り抜けました
あくまでも暫定対策です
JavaScriptよりラクでスマートな方法を恒久対策としたい
ノウハウ/アイデア/ヒント等あれば教えてください
エラーメッセージ
- stale element reference
発生元のパーツ
- 値の設定
要素の主な属性
- input type="search" name="specialNo"
XPath
- //input[@name="specialNo"]
※ nameで一意に定まる
要素の位置
- 検索フォームの最も左上の欄
エラーの場面
- リストの1件目を検索+処理後
- 2件目のために検索画面に戻って特別番号を入力するとこ
バージョン情報
- WinActor 7.2
- Chrome 12x系
- ChromeDriver 同(末尾の桁だけ差異あり)
※ ドライバ指定で利用
エラーを検索した先
- UserForum
- ChatGPT
試したことと成否
- × 値の設定
- × 値の設定(入力再現)
- × 指定時間待機:10秒
- × 要素数取得:1
- × 有効無効状態取得:true
- × スパルタ式(できるまで反復)
- × 属性値の設定:value
- × ズーム:100%
- × エミュレーション:Home
- ◎ DevToolsのConsole:JavaScript
- ◎ アドレスバー:JavaScript
効いたJavaScript
- document.querySelector("input[name='specialNo']").value = '1234567890'
※ 10回中10回成功
※ 爆速
クリア後の所感
- JavaScriptで何とかなるとは思ってた
- もっとベーシックな方法で何とかしたかった
- 何が正攻法なんだろう
- 拡張機能制御なら「値の設定」ですんなりうまくいくはず
拡張機能自体がJavaScript製だから - Ver.7.5シリーズならもっとスマートな攻略法もありそう
どうやら真相っぽい情報
Stale element reference - WebDriver | MDN
https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/StaleElementReference
意訳
- すべてのWeb要素はUUIDで管理されている
- ページ遷移の際にUUIDが一旦破棄され失効する
- WebDriverは古いUUIDのまま制御しようとする
- ゆえにエラーになる
- 「古い要素を参照してるよ」とたしなめられる
素朴なギモン
- 特別番号の上書きを省けば、2周目も検索ボタンとかは「クリック」で制御できてる
- inputのtypeがsearchだからこの症状が出る?
- あるいは複数もあり得るname属性だけで制御しようとしたから?
振り返り(トラブルシュート中の気づき)
- 2周目以降に特別番号が書き換わってない症状を経た
エラーなく空振り
変数「特別番号」は1周毎にリストを順送りできてるのに - 欄をクリアしてから入力で一旦はうまくいったかに見えた
- クリアでも同症状が出るようになった
- PCを再起動してたら、もしかしたらしばらくはこの症状が出ずにうまくいってたのかも
最新の実行結果
- 実行者の1人から、1周目だけ検索ボタンのクリックに失敗すると報告あり
わたしでは再現できず - ひとまずJavaScriptでクリックに差し替えた
検討中のテスト
- 再起動
- これだけを100回テスト
検索でヒットしたアイテムを開く
検索画面に戻る
別の特別番号で検索
★ 2024/12/02追記
JavaScript界隈で類似の症状のノウハウを見つけました
最下部に引用しときます
概ね「要素が読み込まれてからアクセスすべし」な内容
WebDriverのリファレンスとも合致するし矛盾もない
Ver.7.4以降の「読み込み完了待ち」は拡張機能制御で有効という情報
https://winactor.com/questions/question/【wa0097】23_ブラウザ関連_04_待機_「読み込み完了待ち」/
スパルタ式は通用しなかった
読込完了待ちのバランスポイントを見出したい
https://winactor.com/?p=72614
待機もスパルタ式も通用しない
UUIDが再付与された後に要素にアクセスしたい
関係するDOMが固まってから
HTMLソースのほぼ終端に目印になりそうな要素を発見
div id="footer"
扱いやすい
現在地
検索画面に戻ったら
//div[@id="footer"] の要素数がゼロでなくなり次第
特別番号を入力
検索
検索ボタンからはJavaScriptを排除できた
特別番号はそれでもコケることがある
footer以降の読み込みも担保する必要があるのかも
≒ HTMLタグの読み込み完了待ち
ひとまず特別番号はJavaScriptに戻した
爆速で安定稼働中
でもやっぱりJavaScriptを排除したい
もう少し足掻きます
JavaScript界隈で類似の症状のノウハウ
Uncaught TypeError: Cannot read properties of null のエラー対処 #JavaScript - Qiita
https://qiita.com/ninjin831/items/de59dc9ba944eac2ff26
JavaScriptの「Uncaught TypeError: Cannot read property」エラーを解決する方法
https://kinsta.com/jp/knowledgebase/uncaught-typeerror-cannot-read-property/
Uncaught TypeError: Cannot (read set) property of nullの原因と対処法 | Webエンジニア Wiki
https://web-engineer-wiki.com/javascript/error-property-of-null/
Cannot set properties of undefined/nullエラーとは?原因と解決策を解説! - IT Information
https://it-infomation.com/javascript-cannot-set-properties-of-undefined-null/
Cannot read properties of nullの原因と対処法!JavaScriptエラー - キニナリアンテナ
http://kininariantenna.com/?p=7684
javascript エラー「Uncaught TypeError: Cannot read properties of null (reading ‘xxx’)」の解決方法 | mebee
https://mebee.info/2022/02/22/post-57683/
★ 2024/12/03追記
適用後にこう追加報告あり
なおも特別番号が上書きされないことがある(1つ前の特別番号で検索されることがある)
ChatGPTニキに相談
PythonでもSeleniumBasicでもJavaScriptでreturn document.readyStateがcompleteになるまで待機させられる
きっとVer.7.4以降の読み込み完了待ち相当
</body>の直前にユニークな要素を追加できれば、読み込み完了を検知しやすいのかも
要素を追加してみたことはあった
https://winactor.com/questions/question/htmlファイルでtitleタグが無い場合に操作の記録ができ/
ChatGPTニキに教わったJavaScript
document.body.insertAdjacentHTML('beforeend', '<div id="end">最後</div>');
Consoleから実行で、bodyの終端に「最後」が表示できた
- 「最後」の要素挿入
- 「最後」の要素が1になるまで待機
- 特別番号の入力
時間稼ぎにはなるのかもしれない
シュール
10秒待ちが効かなかったから、症状の対策になる気はしない
念のため、もう1度待機も試してみよう
ひとまずクリアを入れる
document.querySelector("input[name='specialNo']").value = "";
- クリア
- 入力
- 取得
- 入力=取得
このスパルタ式で一時凌ぎ中★★
再度ChatGPTニキに相談
- 値の設定
- ウィンドウ状態待機:ID入力フィールドが操作可能になるまで待機
- 値の設定
フェイント後に待ってから再入力なフロー
「ウィンドウ状態待機:特定の要素(この場合はアイテムや入力フィールド)が表示されるまで待つことで、DOMが完全に更新されることを保証します」とのこと
フェイントでエラーになることがあるからやっぱりスパルタ式になる
Ver.7.3以降なら「状態変化待機(要素)」がベストフィットっぽい
https://winactor.com/questions/question/【wa0115】ライブラリ「状態変化待機要素」の待機条/
Ver.7.2で同等の効果を得るには、、
このスパルタ式で行けるものなのかどうか
- 要素数取得:0 ← この瞬間を経ることができるのかどうか
- 要素数取得:1
- 値の設定
- ウィンドウ状態待機?
- 有効無効状態取得:true
- 値の設定
JavaScriptによるクリア後の入力確認スパルタ式の次に試す予定