Laravelのブラウザテストツールduskは以下の様なコードでdriverメソッドからwebdriverを呼び出すことによってブラウザを動かします。このコードはLaravelのデフォルトに近い形でGoogle Chromeを呼び出しています。
/** * Create the RemoteWebDriver instance. * @return \Facebook\WebDriver\Remote\RemoteWebDriver */ protected function driver() { $options = (new ChromeOptions())->addArguments([ '--disable-gpu', '--headless', ]); return RemoteWebDriver::create( 'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(ChromeOptions::CAPABILITY, $options), 300 * 1000, 300 * 1000 ); }
通常duskはLaravel\Dusk\Browserクラスからbrowserを操作します。Browserクラスは堅牢であり、クラス中に生やされたプロパティによるブラウザの状態の把握は便利です。Browserクラスは便利ですが、操作に難があります。本当に手打ちの操作を再現するのみならば問題がない程度には操作メソッドが備わってますが、これは手打ちの再現であり手打ちでは膨大な時間がかかる入力をテストする際に面倒が起きます。typeメソッドによる長文入力はこれに見事に引っかかります。
BrowserクラスはRemoteWebDriverクラスをラッピングしてブラウザ操作を行っています。Browserクラスの下に入っているRemoteWebDriverクラスを直接操作することでより多彩な操作ができます。呼び出し方はいたって簡単次のコードの通り
/** @var Browser $browser */ $web_driver = $browser->driver;
この$web_driver変数からRemoteWebDriverクラスのメソッドを呼びだすことによってさまざまなことが出来ます。できることの一覧はFacebook\WebDriver\Remote\RemoteWebDriver | php-webdriver APIやvendor/facebook/webdriver/lib/Remote/RemoteWebDriver.phpの中身にあります
特に便利なメソッドはexecuteScriptとtakeScreenshotです。executeScriptは次の様にjavascriptを実行できます。長文入力の様な手打ちでやっていられない、手打ちの必要が無い操作はこれで肩代わりするによって実行時間の短縮が図れます。
$browser->driver->executeScript('document.querySelector("[name=\"' . $field . '\"]").value = "' . $value . '";');
takeScreenshotはその名の通りスクリーンショットを取得するメソッドです。Laravelのヘルパ関数によるpath指定を行うことでLaravelプロジェクト内部に任意のタイミングで取得したスクリーンショットを保存できます。