mink/driver-testsuite
Common PHPUnit test suite for Behat Mink drivers to ensure consistent behavior across implementations. Includes a fixture web server runner and an AbstractConfig hook to create your driver and customize/skip tests as needed.
Installation Add the package to your Laravel project via Composer:
composer require --dev minkphp/driver-testsuite
Ensure mink/mink and a Mink driver (e.g., mink/selenium-driver or mink/goutte-driver) are also installed.
Basic Configuration
Extend Laravel’s phpunit.xml to include the test suite:
<phpunit>
<extensions>
<extension class="Mink\Driver\TestSuite\Extension"/>
</extensions>
</phpunit>
Configure Mink in phpunit.xml or config/testing.php:
<env name="MINK_DRIVER" value="selenium2"/>
First Test Case
Use Laravel’s createApplication() and Mink’s Mink facade:
use Laravel\Dusk\Browser;
use Mink\Mink;
use Mink\Driver\TestSuite\Extension;
public function testBasicNavigation()
{
$mink = new Mink(new Extension());
$session = $mink->createSession('selenium2');
$session->start();
$session->visit('/');
$this->assertEquals('Home', $session->getPage()->getTitle());
}
Laravel + Mink/Dusk Hybrid
Laravel\Dusk\Browser for UI tests and Mink for cross-driver validation.Browser in Mink tests:
$browser = Browser::task(function () {
$this->visit('/dashboard');
});
$session = $mink->createSession('goutte');
$session->setPage($browser->driver()->getSession()->getPage());
Driver-Specific Testing
$session->clickLink('Login');
$this->assertTrue($session->getPage()->hasContent('Welcome'));
$session->visit('/api/docs');
$this->assertCount(3, $session->getPage()->findAll('h2'));
Test Data Isolation
DatabaseTransactions trait to reset state:
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
use DatabaseTransactions;
}
Parallel Testing
--group flag to run driver-specific tests in parallel:
phpunit --group selenium --parallel
Driver Mismatches
@group selenium and @group goutte annotations to isolate tests.Session Leaks
try-finally or use Laravel’s tearDown():
protected function tearDown(): void
{
$this->mink->closeAllSessions();
parent::tearDown();
}
Configuration Overrides
phpunit.xml overrides global Mink settings.<env name="MINK_DRIVER" value="%env.MINK_DRIVER%"/>
$session->getDriver()->setDebug(true);
<env name="SELENIUM_BROWSER" value="firefox"/>
<env name="SELENIUM_LOG" value="/tmp/selenium.log"/>
Custom Assertions
Extend Mink’s Assert class for domain-specific checks:
use Mink\Element\NodeElement;
class CustomAssertions extends \PHPUnit\Framework\Assert
{
public static function assertButtonEnabled(NodeElement $element)
{
self::assertTrue($element->isVisible(), 'Button is not visible');
self::assertFalse($element->hasAttribute('disabled'));
}
}
Hook into TestSuite
Override Mink\Driver\TestSuite\Extension to add pre/post-test logic:
class CustomExtension extends \Mink\Driver\TestSuite\Extension
{
public function onPreTest()
{
// Setup (e.g., clear cookies)
}
}
Laravel Service Provider Bind Mink to Laravel’s container for dependency injection:
$this->app->singleton(Mink::class, function ($app) {
return new Mink(new CustomExtension());
});
How can I help you explore Laravel packages today?