Skip to content

Instantly share code, notes, and snippets.

@jhedstrom
Last active June 24, 2021 12:55
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jhedstrom/5bc5192d6dacbf8cc459 to your computer and use it in GitHub Desktop.
Save jhedstrom/5bc5192d6dacbf8cc459 to your computer and use it in GitHub Desktop.
Using the Behat Drupal Extension on sites with basic auth
<?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);
}
}
@PapaGrande
Copy link

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);
    }
  }

@ey-
Copy link

ey- commented Oct 22, 2018

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);
    }
  }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment