Syntheticを使ってWebサイトのテストを行う場合、アクセス先のサイトにBasic認証を要する場合があります。

Basic認証の認証情報はURLにいれることができるので、ドキュメントでは、「https://username:password@site.com」のようにURLに認証情報をいれる方法が紹介されています。

Syntheticテストで最初にアクセスするページからBasic認証が必要な場合は、上記で特に問題ないのですが、途中から必要とする場合が少し面倒です。

この途中から行われる場合に、より容易に対応する方法を2つ紹介します。

なお、今回スクリプトの実証には、こちらのサイトを利用します。サイトのトップページアクセスへは認証情報は必要ありませんが、「Basic HTTP/NTLM Authentication」のタイルにある、「HTTP/NTLM Auth」のリンクをクリックすると、Basic認証が必要なページにアクセスするようになっています。

方法1:Authenticationヘッダーを利用する方法

Basic認証ではAuthenticationヘッダーで認証情報を渡すこともできます。例えば、認証情報が、ユーザ名:user、パスワード:passの場合、「user:pass」の文字列を base64エンコードした値「dXNlcjpwYXNzCg==」を利用し、以下のように追加することでヘッダーに付与することで対応ができます。

$headers.add('Authorization', 'Basic dXNlcjpwYXNzCg==');

スクリプト全体としては、以下のようになります。

var assert = require('assert');

//Basic認証用のヘッダを追加
$headers.add('Authorization', 'Basic dXNlcjpwYXNzCg==');

//以降にテストを記載
$browser.get('https://authenticationtest.com/').then(function() {
  //「HTTP/NTLM Auth」でリンクを探し、クリックする
  return $browser.findElement($driver.By.linkText("HTTP/NTLM Auth")).click().then(function() {

    // xpathでh1要素を探す
    return $browser.findElement($driver.By.xpath("/html/body/div/h1")).then(function(element) {
      //テキストの内容が「Login Success」であれば、成功にする
      return element.getText().then(function(text) {
        assert.equal('Login Success', text, 'H1 title did not match');
      }); 
    });
  });
});

「HTTP/NTLM Auth」のリンクをクリックした先のページではBasic認証が必要ですが、上記ヘッダの追加のみで、Basic認証が通り、テストが成功することが確認いただけます。

方法2:Chromeのキャッシュを利用する方法

 

SyntheticのScripted browserは、ChromeのRuntimeが動作しています。また、Chromeでは、Basic認証の認証情報がキャッシュされ、2回目以降はそのキャッシュが利用されることを活用します。

では、実際のスクリプトを見てみましょう。

var assert = require('assert');

//まず、Basic認証が必要な任意のページにアクセスし、認証情報をブラウザに記憶させる
$browser.get('https://user:pass@authenticationtest.com/HTTPAuth/').then(function(){

  //続いて、本来テストを行いたい最初にアクセスするページへアクセスする
  return $browser.get('https://authenticationtest.com/').then(function() {
	//「HTTP/NTLM Auth」でリンクを探し、クリックする
    return $browser.findElement($driver.By.linkText("HTTP/NTLM Auth")).click().then(function() {

      // xpathでh1要素を探す
      return $browser.findElement($driver.By.xpath("/html/body/div/h1")).then(function(element) {
        //テキストの内容が「Login Success」であれば、成功にする
        return element.getText().then(function(text) {
          assert.equal('Login Success', text, 'H1 title did not match');
        }); 
      });
    });
  });
});

スクリプトは非常に簡単で、以下のようになっています。

  1. Basic認証が必要なページへ直接アクセスして、認証情報を記憶させる
  2. 本来テストしたい最初のページ(https://authenticationtest.com)へアクセスする
  3. 認証が必要なページへのリンクをクリックし、表示されたコンテンツを確認し、h1要素に「HTTP/NTLM Auth」の文字列が表示されているか、assertで確認する

こちら実際にScripted browserにて実行していただくと、リンククリック時のURLに認証情報を記載していなくても、テストが無事に成功することがご確認いただけます。

まとめ

どちらの方法も非常に簡単に対応できることがわかっていただけたと思います。

1つ目の方法に関しては、ヘッダーへ追加のみ、2つ目の方法に関しては、事前に認証が必要なページへアクセスすることで、その後の認証を省略することができました。お客様のポリシーや好みに応じていずれかの方法にてご対応いただくことができます。

なお、Scripted browserのテストは、テストの実行ごとにRuntimeのインスタンスが新規に生成されるため、各テストはキャッシュがクリアされた状態で行われます。

また、パスワード情報をスクリプトに直書きしたくない場合は、Secure credentialsも併用してご利用いただけます。