見出し画像

SeleniumでBasic認証が無理だった話@2021/11/2

この記事では、諦めムードですが、続編もあります。

では、本編です。

-------------------------------------------------------------

諦めました。

これ、無理ゲーですね。

URLにidとパスワードを込みで書く書式があるので、ガチで単純なケースなら、それで行けるのかもしれませんけど、

おそらく、認証サーバーとアプリケーションサーバが別なケースではダメなんじゃないですか。認証サーバに対しては、idとパスワードを投げているので、認証OKとなっても、その先に進めてない気がします。画面真っ白で止まります。ChromeのF12画面を見ると、Success 200となっています。

他に、Firefoxのプロパティをあれこれいじる方法やら、Firefoxのプロファイルを作っておいて、認証を通したプロファイルにしてから、それを読む込む方法とかもやってみましたが、ダメでした。

なんでも、Chromeでは、extensionを作って対処するハックもあるのだとか。。これはちょっとやり過ぎ感ありますね。

[[ リンク切れ ]]

あ、もちろん、Basic認証のダイアログに素で答えようとしてないのは、もちろん、Basic認証のダイアログがSeleniumの範囲外のものだからです。htmlでもなければ、Javascriptのalertでもないですから。。純粋にWindowsアプリケーションの世界になります。それをSeleniumで操作できるわけがないです。

だから、Basic認証のダイアログがそもそも出ないようにっていうアプローチを考えるわけですが、それが見付からないんですよね~。普通に手で操作してる時は、1回入力したら、記憶しておいてくれるのにね~。それだったら、Profileでできそうだけど、Firefoxではできなかった。。Chromeではできるかもしれませんけど、FirefoxでできないけどChromeでできるものをやるとなると、Firefoxが置き去りとなりますからね~。それも気持ち悪いな~。いや、それにまだ、Chromeでできると決まったわけじゃないですし。。できるんなら、Chrome Extensionなどで無理をする話にもならないかと。。

Javaとかだと、Robotクラスを使うとか最終奥義もありますが、ポンコツになる元凶なのでやめたほうがいいです。これで操作する場合、要するにダイアログの存在を認識しつつやってるわけじゃないので。。あくまで、そこにダイアログが存在する前提で、キーボードのキーをどれか押したら、狙い通りになるはず、ってそういうスタンスなので、前提がそもそも成り立ってなければ、単にエラーになるだけです。これは不安定ですわ~。これはいや。

結局、2日ほど考えたのですが、Basic認証無理ゲーという判断をすることになりました。Basic認証とかやめようよ。「おれなら、なんとかできる」って方は、コメント欄でよろしくお願いいたします。私も、Selenium、断続的ですが、8年前からいじってますので。。その知見をもとにしても、きついし、やめたほうがいいのかな、という感触です。もし、ごく一部でBasic認証が必要な他サイトにアクセスする必要がある、とかなら、考えなくもないですが、そもそも、サイト全体がBasic認証必要となると、クリックで遷移してるうちは覚えていてくれますが、ちょいちょいGETアクセスすると、忘れちゃってて、またBasic認証しないといけなくなります。きついなぁ~。

ChromeDriverのsetExtraHTTPHeadersはセキュリティホールになりそうだしなぁ。。

[[ リンク切れ ]]

だめだこりゃ。。

ここで無理をすると、後々、さらなる悲劇を生む気がします。素直にBasic認証を無くしてもらうほうが吉。。おっさんからのおすすめです。

では、また~♪

------------------

P.S.

なんか、ネットワークの設定がおかしかったようで、ChromeとEdgeであれば、自動テスト実行中に、Basic認証のダイアログは出るようになりました。と来れば、もしかしたら、Alert#authenticateAsで行けるかもしれないと思ったのですが、この関数、TypeScriptの型定義ファイルでは存在してるように見えますが、Javascript側を見ると、Selenium 3.9.0(2017年頃のやつ)の時点で削除されてますね。それに、そもそもが、Basic認証のダイアログにswitchTo().alert()しようとしても、NoSuchAlertErrorになりましたしね。authenticateAsなんて、昔は無かったのに、おかしいなあと思ったんですよね。やはり、Basic認証のダイアログはAlertではないので、仮にauthenticateAsがあったとしても無理ですね。

Firefoxについては、Basic認証だけでなく、証明書の件でセキュリティ警告も出てるせいか、自動テスト実行中にBasic認証のダイアログを出すことすら、うまくいきません。証明書についての警告はFirefox Profileを使えば出なくなりますが、Basic認証も合わせると401エラーになります。よく分かりません。

HasAuthenticationっていうのも、Selenium 4.0.0で導入されたようですが、対応してるのは、JavaとRubyだけだそうです。

もし、サーバー側での対応なしと言われた場合、少なくとも、Firefoxは切り捨てになるのかな~。Firefox、特に何が起きてるか分からないんですよね~。ここまでちゃんと作れていたのに、ネットワークの変更のせいでダメになるの、悔しいですね。ChromeやEdgeは、ProfileでID、パスワードを覚えさせておけば、あとは、Enterだけ押せば行けるかもしれませんが、それも微妙な手法ですし、それができたとしても、その先、たまに認証途中で止まることもあって、不安定なんですよね~。ここまで完璧に作れてたのに、やる気ダダ下がり。。Basic認証が無くなる、っていうのが、ベストであることには変わりなさそうです。


冒頭にも書いてますが、Basic認証でやらざるをえない方はこちらです。



この記事が気に入ったらサポートをしてみませんか?