事象
PythonでSelenium/Playwrightを使って、AWS Cognitoの認証ページへのログインを自動化しようとする際、
画面上の要素(入力フォーム)を取得しようとするとエラーが出て要素を取得できませんでした。
怒られ方は
element not interactable
とか
timeout
とかであまり参考にならなかった覚えがあります(後日追記予定)
解決
それぞれのフレームワークで下記のようにページ内でJavaScriptを実行することで取得ができました。
driver.execute_script("document.querySelectorAll('#signInFormUsername').value ='test'")
page.evaluate("document.querySelectorAll('#signInFormUsername').value = 'test'")
考察
上のコードで動いた理由は著者は正確には把握できていません。
一番それっぽい理由は、Seleniumを使ってテスト自動化。[第4回 応用編. Seleniumでテストシナリオを作成する際に注意するポイント]に指摘のある、
「このような場合は要素上にHoverして一度Clickしたあとに入力するような流れをシミュレートする必要があり、JavaScriptだとその操作を(何故か)すっ飛ばせる」というものです。
本当にその処理を行えば入力が可能になるのか、何故Webdriver APIやDevtools Protocolでは直接入力できないのにJavaScriptなら直接入力可能なのか、というところの考察までは面倒だったのですっ飛ばしました。完。
(後者に関してはdriverが現在いる場所を保持しているか保持していないかが作用している予感はします)