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に収められています。