EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

SeleniumでE2Eテストを自動化する

SeleniumでE2Eテストを自動化してみました。 きっかけは、Google Analytics 4を導入したタイミングで既存のJavaScriptの処理に不具合が発生したことで、これを検出することが目的です。

環境構築

必要なライブラリをインストールします。 テストには以前node.jsのプロジェクトで利用したmochaを利用します。 chromeはローカルのメジャーバージョンが100だったので、それを指定しています。

npm install -D selenium-webdriver mocha chromedriver@100

テストの実装

クリックするリンクをCSSセレクタで指定し、クリックイベントを実行します。 手元で実行し、パスすることを確認します。

const { Builder, By } = require('selenium-webdriver');
const assert = require('assert');

// chromeのパスを通す
const chrome = require('selenium-webdriver/chrome');
const chromedriver = require('chromedriver');
chrome.setDefaultService(new chrome.ServiceBuilder(chromedriver.path).build());

let driver;

describe('Selenium_E2E_Test', () => {
  before(() => {
    const options = new chrome.Options()
            .headless()    // Dockerコンテナで実行するのでheadless
            .addArguments(['--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage'])    // メモリの使用量を減らす
            .windowSize({ width: 375, height: 667 });    // スマートフォンの画面サイズ
    driver = new Builder().forBrowser('chrome').setChromeOptions(options).build();
  });

  after(() => {
    return driver.quit();
  });

  it('リンクをクリックしてページの遷移を確認', async () => {
    // ページ遷移
    await driver.get('https://example.com/abc');
    assert.strictEqual(currentUrl, 'https://example.com/abc');

    // リンクをクリック
    await driver.findElement(By.css('.button a')).click();
    currentUrl = await driver.getCurrentUrl();

    // ページの遷移を確認
    assert.strictEqual(currentUrl, 'https://example.com/123');
  });

});

テストの実行

Dockerコンテナで実行するため、Dockerfileを用意します。

Seleniumを利用するため、以下のイメージを利用しました。 github.com

FROM selenium/standalone-chrome:4.1.4-20220427

RUN mkdir /tmp/selenium/
WORKDIR /tmp/selenium/

# node.jsとnpmをインストール
RUN sudo apt update
RUN sudo curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
RUN sudo sh nodesource_setup.sh
RUN sudo apt install -y nodejs
RUN node -v
RUN npm -v

// package.jsonをコピー
COPY package.json /tmp/selenium/
RUN npm install

// テストをコピー
COPY test.js /tmp/selenium/test/

// テストを実行
CMD ["npm", "run", "test"]

コンテナをビルドして実行すると、テストを実行することができます。

> docker build -t selenium-e2e . && docker run --rm selenium-e2e
> mocha test/test.js --timeout 0

  SeleniumChromeTest
    ✔ リンクをクリックしてページの遷移を確認 (2582ms)

  1 passing (3s)

簡単なテスト内容ですが、Seleniumを利用することでE2Eテストを自動化することができました。