2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Selenium/Playwrightで要素が取得できなかった時はJavaScriptを実行するとうまくいく時がある

Last updated at Posted at 2021-12-06

事象

PythonでSelenium/Playwrightを使って、AWS Cognitoの認証ページへのログインを自動化しようとする際、
画面上の要素(入力フォーム)を取得しようとするとエラーが出て要素を取得できませんでした。

怒られ方は

element not interactable

とか

timeout

とかであまり参考にならなかった覚えがあります(後日追記予定)

解決

それぞれのフレームワークで下記のようにページ内でJavaScriptを実行することで取得ができました。

selenium.py
driver.execute_script("document.querySelectorAll('#signInFormUsername').value ='test'")
playwight.py
page.evaluate("document.querySelectorAll('#signInFormUsername').value = 'test'")

考察

上のコードで動いた理由は著者は正確には把握できていません。

一番それっぽい理由は、Seleniumを使ってテスト自動化。[第4回 応用編. Seleniumでテストシナリオを作成する際に注意するポイント]に指摘のある、
「このような場合は要素上にHoverして一度Clickしたあとに入力するような流れをシミュレートする必要があり、JavaScriptだとその操作を(何故か)すっ飛ばせる」というものです。

本当にその処理を行えば入力が可能になるのか、何故Webdriver APIやDevtools Protocolでは直接入力できないのにJavaScriptなら直接入力可能なのか、というところの考察までは面倒だったのですっ飛ばしました。完。
(後者に関してはdriverが現在いる場所を保持しているか保持していないかが作用している予感はします)

参考記事

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?