-
-
Save jhedstrom/5bc5192d6dacbf8cc459 to your computer and use it in GitHub Desktop.
| <?php | |
| /** | |
| * Run before every scenario. | |
| * | |
| * @BeforeScenario | |
| */ | |
| public function beforeScenario() { | |
| if ($basic_auth = $this->getDrupalParameter('basic_auth')) { | |
| $driver = $this->getSession()->getDriver(); | |
| if ($driver instanceof Selenium2Driver) { | |
| // Continue if this is a Selenium driver, since this is handled in | |
| // locatePath(). | |
| } | |
| else { | |
| // Setup basic auth. | |
| $this->getSession()->setBasicAuth($basic_auth['username'], $basic_auth['password']); | |
| } | |
| } | |
| } | |
| /** | |
| * Override MinkContext::locatePath() to work around Selenium not supporting | |
| * basic auth. | |
| */ | |
| public function locatePath($path) { | |
| $driver = $this->getSession()->getDriver(); | |
| if ($driver instanceof Selenium2Driver && $basic_auth = $this->getDrupalParameter('basic_auth'))\ | |
| { | |
| // Add the basic auth parameters to the base url. This only works for | |
| // Firefox. | |
| $startUrl = rtrim($this->getMinkParameter('base_url'), '/') . '/'; | |
| $startUrl = str_replace('://', '://' . $basic_auth['username'] . ':' . $basic_auth['password']\ | |
| . '@', $startUrl); | |
| return 0 !== strpos($path, 'http') ? $startUrl . ltrim($path, '/') : $path; | |
| } | |
| else { | |
| return parent::locatePath($path); | |
| } | |
| } |
good tip @jbickar - worked for me too
the problem I'm having is that after form submit, the page redirects and it doesn't keep the 'username:pass' part. Is that a problem with the site code or something I can do in the behat config?
I'm using this method in FeatureContext.php to do basic auth login:
/**
* Run before every scenario.
*
* @BeforeScenario
*/
public function beforeScenario() {
$this->getSession()->setBasicAuth('boris', 'secret');
}
@batigolix, that is great ^^. I enhanced what you did by receiving the basic auth username and password with env vars. A bit better security so those don't have to get committed to repos.
/**
* Run before every scenario tagged.
*
* @BeforeScenario
*/
public function beforeScenario() {
$username = $_SERVER['BASIC_AUTH_USER'];
$password = $_SERVER['BASIC_AUTH_PASS'];
if (!empty($username) && !empty($password)) {
$this->getSession()->setBasicAuth($username, $password);
}
}
Run test
BASIC_AUTH_USER=<username> BASIC_AUTH_PASS=<passwprd> behat
A small tweak to @shrop's code to make the basic auth credentials optional in the command line:
/**
* Run before every scenario tagged.
*
* @BeforeScenario
*/
public function beforeScenario() {
$username = (isset($_SERVER['BASIC_AUTH_USER']) ? $_SERVER['BASIC_AUTH_USER'] : NULL);
$password = (isset($_SERVER['BASIC_AUTH_PASS']) ? $_SERVER['BASIC_AUTH_PASS'] : NULL);
if (!empty($username) && !empty($password)) {
$this->getSession()->setBasicAuth($username, $password);
}
}
In case someone has the same issue.
Recently we had the following Exception using the snippet from @PapaGrande.
Behat\Testwork\Call\Exception\FatalThrowableError: Fatal error: Call to a member function send() on null in /var/www/vendor/dmore/chrome-mink-driver/src/ChromeDriver.php:1330
This was caused by a not started session prior to using setBasicAuth.
The solution here is to check if the session is started, and if not start it. Resulting into the following:
/**
* Run before every scenario tagged.
*
* @BeforeScenario
*/
public function beforeScenario() {
$username = (isset($_SERVER['APACHE_BASIC_AUTH_USER']) ? $_SERVER['APACHE_BASIC_AUTH_USER'] : NULL);
$password = (isset($_SERVER['APACHE_BASIC_AUTH_PASS']) ? $_SERVER['APACHE_BASIC_AUTH_PASS'] : NULL);
if (!empty($username) && !empty($password)) {
$session = $this->getSession();
if (!$session->isStarted()) {
$session->start();
}
$session->setBasicAuth($username, $password);
}
}
Surprisingly tricky. The Googles led me to this gist, which actually didn't work for me. But setting:
base_url: https://username:[email protected]in
behat.ymldid. YMMV.