7. WebDriver APIをラップしたテストシナリオ
このサンプルは、「6. WebDriver APIを直接使用するテストシナリオ」と同じ処理を、WebDriver APIをラップするCommanderクラスを利用して記述したものです。
直接WebDriver APIを使用する場合に比べ、記述量が少なくなるだけではなく、HTMLエレメントの参照を保存する変数が不要になり1操作が1行で表現されるため全体の見通しが良くなっています。
const {Commander} = require("./commander.js");
const { Builder, Capabilities, Key } = require("selenium-webdriver");
(async function doTest() {
let driver = null;
try {
console.log("capabilitiesの設定");
const capabilities = new Capabilities()
.set("scriptFilter",["\\.html"])
.setBrowserName("safari+G.O");
console.log("WebDriverへ接続");
driver = new Builder()
.usingServer("http://192.168.1.147:7000/wd/hub")
.withCapabilities(capabilities)
.build();
const cmd = new Commander(driver);
console.log("テスト対象アプリのindex.htmlをロード");
await cmd.get("http://dev01.nexaweb.co.jp/GHOST_Operator/demo/index.html");
// 「トップメニュー」のクリックによるalert表示
console.log("「トップメニュー」の表示を待ちクリック");
await cmd.mouseClick("</html/body/div[1]/header/div/h1", null,3000);
console.log("Alertを待機");
await cmd.waitAlert(1000);
console.log("Alertを閉じる");
await cmd.dismissAlert();
// JavaScriptによる値の取得
console.log("appData変数の値を取得");
if(await cmd.executeScript('return appData;')!== "hello") {
throw new Error("appData is not true. appData=" + appData);
}
// アコーディオンメニューの選択
console.log("「問合せボタン」をクリック");
await cmd.mouseClick("</html/body/ul/li[4]/div");
console.log("「ユーザ登録」の表示を待つ");
await cmd.waitVisible("#userreg", 3000);
console.log("「ユーザ登録」の表示OK");
// スクリーンキャプチャによるメニュー表示テスト
console.log("スクリーンキャプチャのために「ユーザ登録」の安定を待つ");
await cmd.delay(700);
console.log("スクリーンキャプチャによるメニュー表示テスト");
await cmd.takeScreenshot({compare:"a4cc7834d3f1df879ee9361eb73943735a05792b6a1ed72671692e83ad074bd8", saveOnError:"images/snapshot.png"});
console.log("「ユーザ登録」をクリック");
await cmd.mouseClick("#userreg");
console.log("ページ遷移を待つ");
await cmd.waitURL(/^http.*\/demo\/reg\.html$/,1000);
console.log("マウス座標をリセット");
await cmd.resetMousePosition();
console.log("「お名前」入力欄の表示をクリック");
await cmd.mouseClick("#name1");
await cmd.delay(100);
console.log("「お名前」の入力");
await cmd.sendKeys(null,["[HanjaMode On]yamada",Key.SPACE,Key.RETURN," "]);
await cmd.sendKeys(null,["tarou",Key.SPACE,Key.RETURN,"[HanjaMode Off]"]);
await cmd.sendKeys(null,Key.TAB);
console.log("「メールアドレス」の入力");
await cmd.sendKeys(null,["Tarou.Yamada@nexaweb.com",Key.COMMAND,"ac"]);
await cmd.sendKeys(null,Key.TAB);
console.log("「メールアドレス(確認用)」の入力");
await cmd.sendKeys(null,[Key.COMMAND, "v"]);
await cmd.sendKeys(null,Key.TAB);
console.log("「電話番号」の入力");
await cmd.sendKeys(null,"080-4321-8765");
console.log("「男性」を選択");
await cmd.mouseClick("</html/body/div[2]/form/div/div[5]/div/label[1]/input");
console.log("「職業」をクリック");
await cmd.mouseClick("#job");
console.log("「職業」のセレクタ表示を待つ");
await cmd.delay(500);
console.log("「Webデザイナ」を選択");
await cmd.mouseClick("#job",{x:250,y:-250});
console.log("「デザインについて」を選択");
await cmd.mouseClick("</html/body/div[2]/form/div/div[7]/div[1]/label/input");
console.log("「マーケティングについて」を選択");
await cmd.mouseClick("</html/body/div[2]/form/div/div[7]/div[3]/label/input");
console.log("「送信する」をクリック");
await cmd.mouseClick("</html/body/div[2]/form/div/button");
console.log("ページ遷移を待つ");
await cmd.waitURL(/^http.*\/demo\/result\.html\?.*$/,3000);
console.log("ページ遷移完了");
console.log("テスト正常終了");
} catch (e) {
console.log(e);
} finally {
if(driver !== null)
await driver.quit();
}
})();
¥※ このサンプルの関連ファイルSeleniumSamples.zipのsec7_wrappedAPIに収められています。