Selenium+DockerでChromeを自動操作する

Selenium+DockerでChromeを自動操作する

こんにちは、原田です!

今回はSeleniumを使ってブラウザ操作をしてみたいと思います。

元々はテストツールとして興味があったのですが、今回はお手軽に自動操作を体感するという目的でやっていきます!

DockerでSeleniumを起動する

Dockerを動かせる環境は用意してある前提で始めていきます。

Seleniumは公式でchromeやFirefoxのブラウザ毎にDockerイメージが用意されています。
こちらを使うことでサクッとSeleniumが動かせるとのことなので、こちらを使っていきます。

下記コマンドを実行してコンテナを起動します。

$ docker run -d -p 4444:4444 -p 5900:5900 -v /dev/shm:/dev/shm selenium/standalone-chrome-debug

Dockerの5900ポートがホストの5900ポートにバインドされているので、localhost:5900でDockerのVNCに接続出来ます。

Macであれば以下で確認してみましょう。

Finder > 移動 > サーバへ接続 > サーバーアドレス: vnc://localhost:5900

パスワードが要求されますがデフォルトでは「secret」に設定されています。

WebDriverのインストール

Dockerで起動しているSeleniumに接続するためのWebDriverをインストールします。

今回はPHPで操作したいので下記ソースを使用します。

https://github.com/php-webdriver/php-webdriver

ローカルに落とせたら下記コマンドをたたく。

$ composer update

PHPUnitがインストールされるのでテストコードを書いていきます。

tests/functionalにSelenium_test.phpを作成します。

<?php
namespace Script;
use PHPUnit\Framework\TestCase;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\WebDriverDimension;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverExpectedCondition;
class Test extends TestCase
{
    const WINDOW_HEIGHT = 900;
    const WINDOW_WIDTH = 1080;
    const SELENIUM_SERVER_HOST = "http://localhost:4444/wd/hub";
    protected $driver;
    public function testSelenium()
    {
        // ドライバーを生成
        $this->driver = RemoteWebDriver::create(self::SELENIUM_SERVER_HOST, DesiredCapabilities::chrome());
        // ブラウザの設定
        $this->driver->manage()->window()->setSize(new WebDriverDimension(self::WINDOW_WIDTH, self::WINDOW_HEIGHT));
        // 接続
        $this->driver->get("https://www.google.co.jp");
        // 検索ボックス取得
        $element = $this->driver->findElement(WebDriverBy::name('q'));
        // キーワード入力
        $element->sendKeys('ハローリノベーション');
        // 検索実行
        $element->submit();
        $this->driver->wait(10)->until(
            WebDriverExpectedCondition::titleIs('ハローリノベーション - Google 検索')
        );
        //検索結果の1位にアクセス
        $this->driver->findElement(WebDriverBy::className("LC20lb"))->click();
        // タイトルを取得
        $title = $this->driver->getTitle();
        $this->assertEquals('ハロー! RENOVATION | みんなで空き家問題を解決しよう!', $title);
        $this->driver->quit();
    }
}

Googleの検索画面にアクセスし、「ハローリノベーション」と検索ボックスに入力します。
その後検索結果の一位に表示されたサイトにアクセスし、そのサイトのtitle要素が期待しているものと一致しているかテストします。

動作確認

それでは下記コマンドを実行してテストを行ってみましょう。

$ php vendor/bin/phpunit tests/functional/Selenium_test.php

VNCでブラウザの動作を確認すると画面遷移はこのようになります。

PHPUnitのテスト結果がこのようになっていればOKです。

PHPUnit 5.7.27 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 8.08 seconds, Memory: 4.00MB

OK (1 test, 1 assertion)

エンジョイワークスでは一緒に働くエンジニアを募集しております!
採用情報はこちらWantedlyも覗いてみてください!

一覧へ戻る

最新記事