WebDriver APIをラップしたテストシナリオ

このサンプルは、「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() {
    const validImg =
    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://dev.tobesoft.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変数の値を取得");
        const ret = await cmd.executeScript('return appData;');
        if(ret !== "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:validImg,
            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に収められています。