## Getting Started
### Minimal Setup
1. **Install the package**:
```bash
composer require --dev friends-of-behat/mink-extension
behat.yml with a basic session (e.g., goutte for headless testing):
default:
extensions:
FriendsOfBehat\MinkExtension:
base_url: 'http://localhost:8000'
sessions:
default:
goutte: ~
MinkContext in your feature context:
use Behat\MinkExtension\Context\MinkContext;
class FeatureContext extends MinkContext {}
vendor/bin/behat
Use pre-defined steps like:
Given I am on "/login"
When I fill in "email" with "user@example.com"
And I press "Login"
Then I should see "Welcome"
@mink:selenium for JS-heavy tests):
@mink:selenium
Scenario: JavaScript-heavy feature
default_session and javascript_session in behat.yml:
suites:
default:
mink_session: default
mink_javascript_session: selenium
MinkContext: Extend once per feature suite (avoid redundant step definitions):
class AdminContext extends MinkContext {
/**
* @Then /^I see the admin dashboard$/
*/
public function iSeeAdminDashboard() {
$this->assertSession()->pageTextContains('Admin Panel');
}
}
MinkContext directly in behat.yml:
contexts:
- FeatureContext
- Behat\MinkExtension\Context\MinkContext
sessions:
api:
goutte: ~
sessions:
selenium:
selenium2:
browser: chrome
sessions:
sauce:
sauce_labs:
username: ${SAUCE_USERNAME}
access_key: ${SAUCE_ACCESS_KEY}
MinkContext for reusable logic:
class CustomContext extends MinkContext {
/**
* @Then /^I wait for element "([^"]*)" to appear$/
*/
public function waitForElement($selector) {
$this->getSession()->wait(5000, "$('$selector').is(':visible')");
}
}
MinkAwareContext for lightweight integration:
use Behat\MinkExtension\Context\MinkAwareContext;
class LightweightContext implements MinkAwareContext {
protected $mink;
public function setMink(Mink $mink) {
$this->mink = $mink;
}
/**
* @Then I do something with Mink
*/
public function customStep() {
$this->mink->getSession()->visit('/');
}
}
files_path in behat.yml:
files_path: '%paths.base%/tests/_data/uploads'
When I attach the file "profile.jpg" to "avatar"
Redundant Step Definitions:
MinkContext only once per feature suite (throws RedundantStepException if duplicated).MinkContext in behat.yml) or extend RawMinkContext.Driver Deprecations:
goutte, selenium, sahi, and zombie drivers are deprecated. Migrate to selenium2 or goutte (with Guzzle 4+).behat.yml and install behat/mink-selenium2-driver.HTTPS Self-Signed Certificates:
sessions:
default:
goutte:
guzzle_parameters:
verify: false
Session Isolation:
@mink:session_name tags to isolate:
@mink:api
Scenario: API-only test
Visual Debugging:
show_auto: true in behat.yml to auto-open failed pages:
show_cmd: 'open %s' # macOS
# or
show_cmd: 'start %s' # Windows
Session Inspection:
$this->getSession()->dump();
Slow Tests:
$this->getSession()->wait(2000, "$('#loader').is(':hidden')");
Custom Drivers:
Behat\Mink\Driver\DriverInterface and register via behat.yml:
sessions:
custom:
custom_driver: ~
Hooks:
beforeScenario/afterScenario in your context for setup/teardown:
protected function beforeScenario(Scenario $scenario) {
$this->getSession()->start();
}
Configuration Overrides:
sessions:
selenium:
selenium2:
browser: ${BROWSER:-chrome}
Laravel-Specific:
Artisan:
php artisan behat
.env for base_url:
base_url: '%env(APP_URL)%'
$this->app->bind('mink', function () {
return Mink::create();
});
@mink:session_name tags to avoid session conflicts in parallel runs.Auth State:
$this->getSession()->reset();
actingAs() in hooks:
$this->getSession()->visit('/login');
$this->getSession()->getDriver()->getClient()->request('POST', '/login', [
'email' => 'user@example.com',
'password' => 'password',
]);
CSRF Tokens:
$this->getSession()->getDriver()->getClient()->getCookieJar()->clear();
Queue Workers:
phpunit.xml or behat.yml:
extensions:
FriendsOfBehat\MinkExtension:
goutte:
http_client_parameters:
headers:
X-Queue-Worker: 'false'
---
How can I help you explore Laravel packages today?