COMPANY SERVICE STAFF BLOG NEWS CONTACT

STAFF BLOG

スタッフブログ

TECHNICAL

テクログ

2022.12.21

nightwatch.jsを試してみた

テクログ

お久しぶりです。

JGです。

前回は Puppeteerを紹介しましたが、今回はnightwatch.jsを試してみたので、 nightwatch.jsについて簡単に説明したいと思います。

概要

nightwatch.jsは一言で表現すると、Seleniumを元に作られたブラウザでのテストを自動化できるツールです。

JavaScriptとTypeScriptに対応しています。

環境構築

Windowsの手順しか書いておりませんが、Macも似たような手順だと思います。

少し手順が多いですが、下記の手順でできると思います。

今回のnightwatch.jsのバージョンは2.5.1です。

1.Node.jsをインストール

公式ドキュメントのバージョンに合わせて16.14.2をインストールしましたが、バージョンによっては上手く環境構築ができない場合がありました。

2.コマンドプロンプトで下記を実行(今回はnightwatchフォルダを作成し、そのディレクトリで実行)

npm init nightwatch

3.幾つかの質問を聞かれるので、下記を選択する

What is your Language - Test Runner setup? (Use arrow keys)
> JavaScript - Nightwatch Test Runner

Where do you want to run your e2e tests? (Use arrow keys)
> Both

Please select your cloud provider
> BrowserStack

Where you'll be testing on? (Press <space> to select, <a> to toggle all, <i> to invert selection,
and <enter< to proceed)
>(*) Chrome

Where do you plan to keep your end-to-end tests?
> tests

What is the base_url of your project?
> http://localhost

詳細な説明は下記の公式ドキュメントを参考にして下さい。

https://nightwatchjs.org/guide/quickstarts/create-and-run-a-nightwatch-test.html

4.質問の回答が終わると、下記がコンソール画面に表示される

TEMPLATE TESTS

To get started, checkout the following templates. Skip/delete them if you are an experienced user.
  1. Title Assertion (nightwatch\templates\titleAssertion.js)
  2. Login (nightwatch\templates\login.js)

RUN NIGHTWATCH TESTS

To run all examples, run:
  npx nightwatch .\nightwatch\examples

To run a single example (ecosia.js), run:
  npx nightwatch .\nightwatch\examples\basic\ecosia.js

5.4に記載されているsingle exampleを実行し、海外のWEBサイトが起動すれば環境構築完了です

npx nightwatch nightwatch/examples/basic/ecosia.js --env chrome

6.下記のエラーが表示される場合はnightwatch.conf.jsのchromeのargsの–no-sandboxのコメントアウトを外して有効にし、再度5を実行する

error: 'unknown error',
message: 'unknown error: Chrome failed to start: crashed.\n' +
 '  (chrome not reachable)\n' +
 '  (The process started from chrome location chrome.exe is no longer running, so ChromeDriver is assuming that Chrome has crashed.)',

指定したURLを起動する方法

ここからはnightwatch.jsできることをJavaScriptを使い、紹介していきたいと思います。

まずは指定したURLを起動する方法です。

testsフォルダ配下に下記のtest.jsを作成します。

describe('test', function() {
    before(browser => browser.navigateTo('https://www.yahoo.co.jp/'));
    it('Demo test', function(browser) {
        browser
            .waitForElementVisible('body');
    });

    after(browser => browser.end());
});

そして下記コマンドを実行すれば、yahooのページが表示されるはずです。

npx nightwatch tests/test.js --env chrome

コンソールを表示する方法

ブラウザのコンソールの内容を表示する方法です。

testsフォルダ配下に下記のtest2.jsを作成します。

describe('test2', function() {
    it('Demo test2', function(browser) {
        browser
    .navigateTo('https://www.yahoo.co.jp/')
    .waitForElementVisible('body')
    .getLog('browser', function(logEntriesArray) {
            console.log('Log length: ' + logEntriesArray.length);
        logEntriesArray.forEach(function(log) {
                console.log(log.level['name'] + ' : '+ log.timestamp + ' : ' + log.message);
        });
            });
    });
});

そして下記コマンドを実行すれば、ブラウザのコンソールの内容が表示されるはずです。

npx nightwatch tests/test2.js --env chrome

ログインする方法

IDとパスワードを入力して、ログインする方法です。

testsフォルダ配下に下記のtest3.jsを作成します。

describe('test3', function() {
    before(browser => browser.navigateTo('https://login.yahoo.co.jp/config/login?.src=www&.done=https://www.yahoo.co.jp/'));
    it('Demo test3', function(browser) {
        browser
            .waitForElementVisible('body')
            .setValue(By.id('username'), 'id')
            .click(By.id('btnNext'))
            .pause(5000)
            .setValue('input[type=password]', 'password')
            .click(By.id('btnSubmit'));
    });
    after(browser => browser.end());
});

そして下記コマンドを実行すれば、yahooにログインできるはずです。

npx nightwatch tests/test3.js --env chrome

スマホでアクセスする方法

スマホでアクセスする方法です。

testsフォルダ配下に下記のtest4.jsを作成します。

describe('test4', function() {
    it('Demo test4', function(browser) {
        browser
        .navigateTo('https://www.yahoo.co.jp/')
    .waitForElementVisible('body')
    .pause(5000);
    });
});

今回は既存のままのnightwatch.conf.jsではスマホでアクセスできないため、専用のconf.jsを作成し、実行時にそれを呼び出す必要があります。

nightwatch.conf.jsをコピーしてnightwatch2.conf.jsを作成し、chromeのargsの下に下記を追加します。

mobileEmulation: {
    deviceName: 'Galaxy Fold'
}

そして下記コマンドを実行すれば、スマホのyahooが表示されます。

npx nightwatch tests/test4.js --env chrome -c nightwatch2.conf.js

スクショをとる方法

スクショをとる方法です。

testsフォルダ配下に下記のtest5.jsとimagesフォルダを作成します。

describe('test', function() {
    before(browser => browser.navigateTo('https://www.yahoo.co.jp/'));    
        it('Demo test', function(browser) {
            browser
                .waitForElementVisible('body')
                .saveScreenshot('tests/images/image_'+get_now_datetime()+'.png');
        });
        after(browser => browser.end());
});

function get_now_datetime() {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const date = now.getDate();
    const hour = now.getHours();
    const min = now.getMinutes();
    const sec = now.getSeconds();
    return year + '_' + month + '_' + date + '_' + hour + '_' + min + '_' + sec;
}

そして下記コマンドを実行すれば、yahooにアクセスした画像がimagesフォルダに出力されます。

npx nightwatch tests/test5.js --env chrome

スクレイピングの方法

最後はスクレイピングの方法です。

testsフォルダ配下に下記のtest6.jsとimagesフォルダを作成します。

describe('test6', function()     {
    it('Demo test6', function(browser) {
        const urls = [
            'https://www.yahoo.co.jp/',
            'https://www.google.com/'
        ];

        for (const url of urls) {
            browser
            .navigateTo(url)
            .waitForElementVisible('body')
            .saveScreenshot('tests/images/image_'+get_now_datetime()+'.png')
            .getLog('browser', function(logEntriesArray) {
                console.log('Log length: ' + logEntriesArray.length);
                logEntriesArray.forEach(function(log) {
                    console.log(log.level['name'] + ' : '+ log.timestamp + ' : ' + log.message);
                });
            });
        }
    });
});

function get_now_datetime() {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const date = now.getDate();
    const hour = now.getHours();
    const min = now.getMinutes();
    const sec = now.getSeconds();
    const ms = now.getMilliseconds();
    return year + '_' + month + '_' + date + '_' + hour + '_' + min + '_' + sec + '_' +ms;
}

そして下記コマンドを実行すれば、アクセスしたページがimagesフォルダに出力されます。

npx nightwatch tests/test6.js --env chrome

最後に

本当に簡単にnightwatch.jsについて説明しました。

もし興味を持ったかたやコピペしたけど動かない等があれば、JGまで遠慮なく聞いてください。

この記事を書いた人

JG

入社年2020年

出身地神奈川県

業務内容プログラム

特技・趣味サッカー観戦

テクログに関する記事一覧

TOP