問題
下のように、ウェブサイトにアクセスした際にポップアップで認証情報(ユーザ名とパスワードの2つ)を要求される。
2つ入力がある場合の対応方法がわからなかったので調べてみた。
結論としては、Tabを入れるという原始的な方法でクリアしました。試してませんが、3つ以上の複数でも同じやり方でできそうです。
解決策
環境
ホストマシン: Windows10
Python: 3.7
Selenium: 3.141
Driver: geckodriver_v0.23-win64.exe
Browser: Firefox 67.0b5 (32-bit)
既存の解決策調査
そもそもこの画面はSelenium的にはalertというオブジェクトのPromptというタイプになるらしい。
alertオブジェクトへの操作については、こちらが参考になりました。
ただ、2つ入力枠があるものに関するやり方がなかなか見つけられず。
Stack Overflowのこちらが全く同じことで悩んでいたが、以下のような回答をされていた。
The problem is Selenium cannot identify the authentication popups. That is a limitation of Selenium as far as I know. You can overcome the issue with using java Robot actions to fill out the username and password.
つまりSelenium単体ではできず、RPA的なことを組み合わせる必要があるらしい。
その下ではauthenticateというメソッドでできるとあったが、公式を見ても見つけられず。
You can try this:
driver.switch_to.alert.authenticate('cheese', 'secretGouda')
自分の場合
RPA組み合わせるとかつらいので、入力時にTABを入れることでクリアしました。
TABの入力については公式で確認。
# 認証画面が出てきたら、alertオブジェクトにスイッチ
obj = driver.switch_to.alert
# 1つ目の入力と2つ目の入力の間にTABを入れる。
obj.send_keys(USERNAME + u'\ue004' + PASSWORD)
# 最後にOKを押す。
obj.accept()
補足としてalertというオブジェクトに関しては、OK、Cancel、(Promptの場合)入力という3つの要素しか想定していないようで、場合によってOKは「承認」とか「Accept」とか別の表現をされているケースもあるようですが、全てaccept()というメソッドでクリックできるようです。send_keysに関してもalertだけ指定すればよいみたい。