Installation:
composer require behat/mink-selenium2-driver --dev
Add to composer.json under require-dev to avoid production bloat.
First Use Case:
use Behat\Mink\Mink;
use Behat\Mink\Session;
use Behat\Mink\Driver\Selenium2Driver;
$mink = new Mink([
'selenium2' => new Session(new Selenium2Driver('chrome')),
]);
$session = $mink->getSession('selenium2');
$session->visit('/login');
$session->fillField('email', 'user@example.com');
$session->fillField('password', 'secret');
$session->pressButton('Login');
Where to Look First:
firefox, chrome).phpunit.xml or behat.yml for configuration (see below).PHPUnit + Mink:
PHPUnit\Framework\TestCase and initialize Mink in setUp():
protected function setUp(): void
{
$this->mink = new Mink([
'selenium2' => new Session(new Selenium2Driver('chrome', '/path/to/chromedriver')),
]);
}
tearDown() to avoid zombie processes:
protected function tearDown(): void
{
$this->mink->getSession()->quit();
}
Behat Integration:
behat.yml:
default:
extensions:
Behat\MinkExtension:
base_url: 'http://localhost:8000'
selenium2:
wd_host: 'http://localhost:4444/wd/hub'
browsers:
chrome:
browser: 'chrome'
wd_host: 'http://localhost:4444/wd/hub'
vendor/bin/behat --config behat.yml
Dusk Alternative:
use Laravel\Dusk\Browser;
use Behat\Mink\Driver\Selenium2Driver;
// In a custom Dusk trait:
protected function createMinkSession(): Session
{
return new Session(new Selenium2Driver('firefox'));
}
Dynamic Browser Selection:
.env.testing) to switch browsers:
$browser = env('BROWSER', 'chrome');
$driver = new Selenium2Driver($browser, env('WD_HOST'));
Driver Paths:
chromedriver/geckodriver is in PATH or specify full paths:
new Selenium2Driver('chrome', '/usr/local/bin/chromedriver')
selenium/standalone-chrome).Session Management:
$session->quit() to free resources. Use try-finally for safety:
try {
$session->visit('/dashboard');
} finally {
$session->quit();
}
Artisan::call('mink:quit'); // Custom Artisan command to quit all sessions.
Headless Mode:
$driver = new Selenium2Driver('chrome', null, [
'chromeOptions' => ['args' => ['--headless', '--disable-gpu']],
]);
moz:firefoxOptions:
$driver = new Selenium2Driver('firefox', null, [
'moz:firefoxOptions' => ['args' => ['-headless']],
]);
Slow Tests:
$session->getDriver()->wait(2000); // 2-second implicit wait.
wd_host to point to hub).Logs:
$driver = new Selenium2Driver('chrome', null, [], null, [
'loggingPrefs' => ['browser' => 'ALL'],
]);
var/log/mink.log (if configured in MinkExtension).Screenshots:
if ($session->getPage()->hasContent('Error')) {
$session->takeScreenshot('error.png');
}
Common Errors:
SessionNotCreatedException: Verify browser/driver compatibility (e.g., Chrome 100+ requires chromedriver 100+).ElementNotFoundException: Use explicit waits:
$session->wait(5000, function ($context) {
return $context->getSession()->getPage()->has('css', '.loader');
});
Custom Capabilities:
$driver = new Selenium2Driver('chrome', null, [
'chromeOptions' => [
'args' => ['--window-size=375,812'], // iPhone X
'extensions' => ['path/to/extension.crx'],
],
]);
Proxy Support:
$driver = new Selenium2Driver('chrome', null, [
'proxy' => [
'httpProxy' => 'http://proxy-server:8080',
'sslProxy' => 'http://proxy-server:8080',
],
]);
Laravel Service Provider:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Mink::class, function () {
return new Mink([
'selenium2' => new Session(new Selenium2Driver('chrome')),
]);
});
}
How can I help you explore Laravel packages today?