profileを設定し、chromeを起動した後にページ遷移がなされません

2,901 views
Skip to first unread message

kanat...@gmail.com

unread,
Jan 7, 2018, 4:56:35 AM1/7/18
to 日本Seleniumユーザーコミュニティ
初めましてIzumiと申します。
現在、ウェブサイトの2段階認証の手順をスキップするために、profileを設定してchromeを起動しようと思っております。
(profileを設定しないと、再度プログラムを起動した際にまた二段階認証を求められるためです)
とりあえず、profileを設定して起動しURLへ遷移するという手順を作るために、色々検索して、下記コードを書きました。

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class browserinvocation {
 
public static void main(String[] args) {

   
//クロームを起動
   
String chromeDriver = "chromedriver.exe";
   
System.setProperty("webdriver.chrome.driver", chromeDriver);
   
ChromeOptions options = new ChromeOptions();
   
String dir= "C:\\Users\\takat\\AppData\\Local\\Google\\Chrome\\User Data";
    options
.addArguments("user-data-dir="+dir);
   
ChromeDriver driver = new ChromeDriver(options);

   
//ページ遷移
    driver
.get("http://www.selenium.jp/");
   
}
}

そこでお伺いしたいことがあるのですが、
JAVAにてprofileを設定し、chromeを起動して、最後の
でページ遷移しようとしているのですが、
chromeが起動した後、最後のページ遷移がなぜかなされません。(profileを設定しなければきちんと遷移します)
何か情報をお持ちの方がいらっしゃっいましたら、ご教示いただけると大変ありがたく
存じます。

参考URL

環境
WIndows 10
selenium-java-3.8.1
JAVA(TM) Platform SE8

伊藤望

unread,
Jan 9, 2018, 9:06:48 PM1/9/18
to 日本Seleniumユーザーコミュニティ
Izumiさん、こんにちは。
伊藤です。

手元のMac + 最新(3.8.1)のSelenium + ChromeDriverで試したのですが、独自プロファイルでselenium.jpのURLに遷移できました。
(String dirの値には存在しないディレクトリを指定したので、たぶん新規にプロファイルが作成されました)

"C:\\Users\\takat\\AppData\\Local\\Google\\Chrome\\User Data"; 
  は既存のChromeのプロファイルだと思うので、そこに何か問題あるデータがあるのではないでしょうか。
  新規ディレクトリをuser-data-dirとしてChromeをChromeDriverで起動し、それを閉じずにブラウザ上で手動で
  2段階認証とかすれば、新規のuser-data-dirに綺麗なprofileが作成されるかもしれません。

- SeleniumやChromeDriver.exeを最新にしたら動くかもしれません。

- そもそも二段階認証の情報はCookieとかLocal storageとかに保存されているのではないでしょうか。
  もしそうなら、SeleniumのCookie系のコマンドを使ってテスト開始時にCookie等をセットする方が
  テストのメンテナンス性としては良いように思います。

kanat...@gmail.com

unread,
Jan 9, 2018, 10:52:24 PM1/9/18
to 日本Seleniumユーザーコミュニティ
伊藤様

わざわざ試していただきましてありがとうございました。
おっしゃりますように、新規でプロファイルを作成したところ、
問題なく遷移することができました。誠にありがとうございます。
この問題はSeleniumのベテランの方2人に尋ねても原因不明な問題でしたので、
非常に助かりました。

Cookieの件も参考にさせていただきます。
重ねてお礼申し上げます。

2018年1月10日水曜日 11時06分48秒 UTC+9 伊藤望:

Jun-ichi Sakamoto

unread,
Jan 14, 2018, 1:24:46 AM1/14/18
to 日本Seleniumユーザーコミュニティ
ちょっと余談かと思いますが、二要素認証のタイプによっては、profile の指定や Cookie の設定で "迂回" するのみならず、正面切って認証を通過する方法もあるなぁ、と思いました。

とくに Google Authenticator などによるワンタイムパスワードでの二要素認証であれば、実現しやすいです。
つまり、テストプログラム自身が二要素認証コードを計算・発行して、Selenium 経由で UI に入力してやればよいので。
(メールで認証コードを送るタイプの二要素認証も、まだ可能な部類なはず。SMSで認証コードを送るタイプの二要素認証は、できるんだけど、ちょっとハードルが高いと思う。詳細割愛。)

言うだけではアレかと思い、サンプルの Web アプリと、その Web アプリの二要素認証を通過する Selenium による E2E テストプログラムの事例を、下記にあげました。

https://github.com/sample-by-jsakamoto/Selenium-E2ETest-for-OTP2FAAuth#end-to-end-test-program-sample-with-selenium-for-otp-two-factor-auth-web-site

私は C# が得意なので上記サンプルは C# になっちゃってますけど、キモは、テストプログラム内部での二要素認証コードの計算でしかありませんので、どのような言語・処理系でも実現可能なはずです。
(テストプログラムに内蔵するのが困難だとしても、Selenium はブラウザの操縦が得意なのですから、「シークレットキーを入力したら二要素認証コードを表示する」という Web アプリを追加で検証環境内に立ち上げれば、その Web アプリを "操作" することで二要素認証コードを手に入れてテスト続行するような Selenium によるテストも書けますね :) )

何事もケースバイケースですので、profile 指定や cookie 操作のほうがより良いケースのほうが多いかとも思います。
いっぽうで、品質保証活動としての E2E テストではなく、本番環境へのデプロイ直後の正常系巡回検査などの目的では、「本番環境、新しいバージョンに入れ替えたけど、二要素認証が死んでないか?」といった点検を Selenium で自動化するにあたり、上記正面突破法が効くのではないかな、と思いました。

伊藤望

unread,
Jan 14, 2018, 11:32:02 PM1/14/18
to 日本Seleniumユーザーコミュニティ
伊藤です。

なるほど、興味深いですね。

https://github.com/sample-by-jsakamoto/Selenium-E2ETest-for-OTP2FAAuth/blob/master/OTP2FAAuthWebAppDemo.E2ETest/appSettings.json
のotpKeyにサーバサイドで利用しているのと同じシークレットキーを設定しておき、

のロジックを呼び出せば、その時点でサーバで計算されているのと全く同じ認証コードが
クライアント側でも取得できるということでしょうか。

知りませんでした!

kanat...@gmail.com

unread,
Jan 15, 2018, 7:28:51 AM1/15/18
to 日本Seleniumユーザーコミュニティ
un-ichi Sakamoto様
拝見させていただきました。
すごいですね。こんなことできるんですね!
感動を覚えました。

ここに頂いた書き込みは永久保存しておきたいと思います。


2018年1月14日日曜日 15時24分46秒 UTC+9 Jun-ichi Sakamoto:

Jun-ichi Sakamoto

unread,
Jan 15, 2018, 9:23:51 AM1/15/18
to 日本Seleniumユーザーコミュニティ
伊藤です。
https://github.com/sample-by-jsakamoto/Selenium-E2ETest-for-OTP2FAAuth/blob/master/OTP2FAAuthWebAppDemo.E2ETest/appSettings.json
のotpKeyにサーバサイドで利用しているのと同じシークレットキーを設定しておき、

ですです。
あまり大した解説も付けていないのに読み解いていただいて大変恐縮です。

もう少し付け足すと、この "サーバーサイドで利用しているのと同じシークレットキー" というのは、「Authenticator モバイルアプリで、このQRコードをスキャンしてね」というときの、あの QR コードに埋め込まれているコードです。
そしてそのような二要素認証セットアップページには、QRコードが読めなかった場合に備えて、「キーを手入力するときはこれを入れてね」と英数字の羅列が表示されているはずなのですが(そして Authenticator モバイルアプリにも、QRコードを撮影するだけでなくキーを手入力するオプションが用意されています)、実のところその英数字の羅列が "サーバーサイドで利用しているのと同じシークレットキー" です (Base32 でエンコードしたものです)。

appSettings.Development.json に、上記、二要素認証セットアップページに掲載の「キーを手入力するときはこれを入れてね」の英数字の羅列を設定すれば OK、というのは、そういう仕組みだからなのでした。

のロジックを呼び出せば、その時点でサーバで計算されているのと全く同じ認証コードが
クライアント側でも取得できるということでしょうか。

まったくもってそのとおりです。
別の言い方をすれば、Google Authenticator モバイルアプリを、テストプログラムに内蔵したようなものです。

On Monday, January 15, 2018 at 9:28:51 PM UTC+9, kanat...@gmail.com wrote:
拝見させていただきました。
すごいですね。こんなことできるんですね!
 
はいー。
こういうことができることを知らないときは「おおっ!」と思いますが(私もこれを知った時に「おおっ!」と思いました :) )、実は Google Authenticator モバイルアプリがやってる仕組みって、プログラマ的には難しくなかったんですね。

私もサンプルコードとしてまとめはしましたが、このワンタイムパスワードを計算してくれるライブラリが公開されているおかげで、キモの部分はたかだか2~3行程度で済んでしまってます。

繰り返しになってしまいますが、こういうこと( Authenticator モバイルアプリと同じ機能をテストプログラムに内蔵して、二要素認証を正面突破する方法 ) が "できる" からといって、"そうすべき" ということにはならないとは思ってます。
profile 指定や cookie 設定の技法も、認証済みの状態をつくりあげることで認証画面をスキップしてテスト対象を実行できるので、テストの消化速度があがる・未認証かどうかの判定不要で安定したテストが書ける、など、利点も多いと思います。
月並みな感想ですが、どの技法を選択するかは結局はケースバイケース、っていうのが今のところの自分の結論です。

伊藤望

unread,
Jan 16, 2018, 10:36:18 PM1/16/18
to 日本Seleniumユーザーコミュニティ
> Authenticator モバイルアプリと同じ機能をテストプログラムに内蔵して、二要素認証を正面突破する方法

なるほど!Authenticatorのアプリってサーバと定期通信して認証の数字を表示してるんだと思ってました!
アプリ内で計算してたんですね。
であれば、むしろテストコード内で計算するのは正攻法ではないでしょうか。

Cookieとかchromeのprofileを使う方法だと、
二段階認証の期限が切れた時に困りそうですし、テストコードも複雑になります。

「1つ目のテストでコード計算して二段階認証ログインし、2つ目のテストからは同じセッションを使い回す。」
もしくは、
「テスト用のユーザーは二段階認証を切る。もしくはテスト用にそういう仕組みをサーバ側に実装する」
あたりが一番いい気がします。

JavaのOne time password計算ライブラリもいくつかあるようなので、これでいけるんですかね。
どれが一番いいのかあまり判然としませんが。

Jun-ichi Sakamoto

unread,
Jan 17, 2018, 9:22:24 AM1/17/18
to 日本Seleniumユーザーコミュニティ
スレタイ違いな方向に引っ張ってしまってすみません (汗

アプリ内で計算してたんですね。
であれば、むしろテストコード内で計算するのは正攻法ではないでしょうか。

なるほど、たしかにそのようにも考えられますね。
また、自分も要件次第で「テスト用のユーザーは二段階認証を切る。もしくはテスト用にそういう仕組みをサーバ側に実装する」作戦を採るなー、と思いました。

JavaのOne time password計算ライブラリもいくつかあるようなので、これでいけるんですかね。
どれが一番いいのかあまり判然としませんが。


すべては試していませんが、aerogear-otp-java は実証コード書けました。


ご参考までに。

伊藤望

unread,
Jan 18, 2018, 3:01:30 AM1/18/18
to 日本Seleniumユーザーコミュニティ
> すべては試していませんが、aerogear-otp-java は実証コード書けました。

ありがとうございます!
Reply all
Reply to author
Forward
0 new messages