behat/mink-selenium-driver
Selenium 1 driver for Behat Mink. Run browser-driven tests via the legacy Selenium RC API by creating a Mink Session with SeleniumDriver and Selenium\Client, then interact with pages (click links, fill forms) for end-to-end testing.
Installation:
composer require behat/mink-selenium-driver
(Note: Requires facebook/webdriver and behat/mink as dependencies. Install them first if missing.)
First Use Case:
use Behat\Mink\Mink;
use Behat\Mink\Session;
use Behat\Mink\Driver\SeleniumDriver;
use Facebook\WebDriver\Remote\RemoteWebDriver;
$mink = new Mink([
'selenium' => new Session(new SeleniumDriver(RemoteWebDriver::create([
'browserName' => 'chrome',
'browser_version' => 'latest',
'platform' => 'LINUX',
'selenium_version' => '3.141.59',
]), 'http://localhost:4444/wd/hub')),
]);
$session = $mink->getSession('selenium');
$session->visit('/login');
$session->fillField('email', 'user@example.com');
$session->fillField('password', 'secret');
$session->pressButton('Login');
Where to Look First:
Artisan commands to spin up Selenium Grid (e.g., via Docker) for local testing.Integration with Laravel Testing:
phpunit.xml or a custom test listener:
<listeners>
<listener class="App\Tests\MinkTestListener" />
</listeners>
public function startTestSuite(TestSuite $suite) {
$this->mink = new Mink([
'selenium' => new Session(new SeleniumDriver(RemoteWebDriver::create($caps))),
]);
}
Reusable Test Helpers:
trait SeleniumHelper {
public function loginAsUser($email, $password) {
$session = $this->mink->getSession('selenium');
$session->visit('/login');
$session->fillField('email', $email)->fillField('password', $password)->pressButton('Login');
}
}
Parallel Testing:
$caps = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create('http://grid-hub:4444/wd/hub', $caps);
Headless Mode:
$caps = DesiredCapabilities::chrome();
$caps->setCapability('goog:chromeOptions', [
'args' => ['--headless', '--disable-gpu']
]);
Service Container Binding: Bind Mink to Laravel’s IoC container for dependency injection:
$this->app->singleton(Mink::class, function ($app) {
return new Mink([
'selenium' => new Session(new SeleniumDriver(RemoteWebDriver::create($app['config']['mink.selenium.caps'])))
]);
});
Configuration:
Store Selenium settings in config/mink.php:
return [
'selenium' => [
'hub_url' => env('SELENIUM_HUB_URL', 'http://localhost:4444/wd/hub'),
'browser' => 'chrome',
'headless' => env('SELENIUM_HEADLESS', false),
],
];
Deprecation Warnings:
facebook/webdriver (Selenium 3+) for modern compatibility.Selenium\Client with Facebook\WebDriver\Remote\RemoteWebDriver.Session Management:
$session->reset();
Mink::setDefaultSessionName() to avoid leaks.Browser-Specific Issues:
$caps->setCapability('goog:chromeOptions', [
'args' => ['--no-sandbox', '--disable-dev-shm-usage']
]);
$caps->setCapability('moz:firefoxOptions', [
'binary' => '/path/to/geckodriver'
]);
Performance:
$session->wait(10000, function ($context) {
return $context->getPage()->hasContent('Expected content');
});
Logs:
$driver = RemoteWebDriver::create($caps, 'http://localhost:4444/wd/hub', 5000, true);
$session->getDriver()->getStatus();
Screenshots:
try {
$session->clickLink('Broken Link');
} catch (\Exception $e) {
$session->takeScreenshot('screenshot.png');
throw $e;
}
Common Errors:
java -jar selenium-server.jar).$session->switchToIFrame('iframe-id')->clickLink('Link');
Custom Drivers:
SeleniumDriver for Laravel-specific logic:
class LaravelSeleniumDriver extends SeleniumDriver {
public function loginAsAdmin() {
$this->getSession()->fillField('email', config('admin.email'));
// ...
}
}
Event Listeners:
SessionStarted) for setup/teardown:
$mink->getSession('selenium')->getDriver()->on('sessionStarted', function () {
// Pre-test setup (e.g., DB seeding)
});
Hybrid Testing:
$response = $this->post('/api/login', ['email' => 'user@example.com']);
$this->mink->getSession('selenium')->visit('/dashboard'); // Post-login UI test
How can I help you explore Laravel packages today?