WebDriverでBasic認証を突破する


WebDriverでのBasic認証突破

  • Basic認証がかかっているページの対処方法について書きます。
  • テスト用のサイトはBasic認証外すっていう対応もいいと思います。
  • でも、環境ごとに差分作りたくなかったり、Basic認証通ること自体をテストしたいこともあるかも。
  • とはいえ、GUI自動テストは万能ってわけでもないので、自動テストする観点を分けるっていう諦めもときには大事だと思っています。

通常は、以下の通りでよいはず

  WebDriverWait wait = new WebDriverWait(driver, 10);
  Alert alert = wait.until(ExpectedConditions.alertIsPresent()); 
  alert.authenticateUsing(new UserAndPassword(username, password));
  • しかし、現状(2017/08/02)はInternetExplorerDriver、かつSelenium-3.4でしか動作していない。
  • 各ブラウザのDriverは安定しないことも多く、一度動いていても動かなくなったり、Chromeでは動いたけど、IEでは動かないなどということもある。

そのため、以下のような対処方法となる。

/**
 * Basic認証付きページにアクセスする
 * @param driver webdriver
 * @param baseUrl 認証ありページと同一ドメインの認証なしページ
 * @param protectedUrl 認証ありページ
 * @param username username
 * @param password password
 */
public static void basicAuthentication(
        WebDriver driver, String baseUrl, String protectedUrl, String username, String password) {
    // 認証前ページにアクセス
    driver.get(baseUrl);

    // JavaScriptで認証
    JavascriptExecutor jexec = (JavascriptExecutor) driver;
    StringBuilder js = new StringBuilder();
    js.append("var XMLReq = new XMLHttpRequest();");
    js.append("XMLReq.open('GET', '"
            + protectedUrl + "', false, '"
            + username + "', '" + 
            password + "');");
    js.append("XMLReq.send(null);");
    jexec.executeScript(js.toString());

    // 認証後ページにアクセス
    driver.get(protectedUrl);
}
  • 流れ

    1. 認証が必要なページと同一ドメインで、認証がかかっていないページに遷移する。※前提条件となる。
    2. JavaScriptのXMLHttpRequestを使い、Basic認証を行う
    3. 認証がかかっているページに遷移する。
  • ※前提条件:ドメイン内のすべてのページでBasic認証がかかっている場合、この方法は使えない。

    • JavaScriptでリクエストを投げる場合、同一ドメインから投げる必要があるため。ドメイン内のページに遷移後、JavaScriptからリクエストを発行するとう仕組みを使っている。