2016-04-20 09:56:34 -07:00
< ? php
namespace Drupal\FunctionalJavascriptTests ;
use Drupal\Tests\BrowserTestBase ;
use Zumba\Mink\Driver\PhantomJSDriver ;
/**
* Runs a browser test using PhantomJS .
*
* Base class for testing browser interaction implemented in JavaScript .
*/
abstract class JavascriptTestBase extends BrowserTestBase {
/**
* { @ inheritdoc }
*/
protected $minkDefaultDriverClass = PhantomJSDriver :: class ;
/**
* { @ inheritdoc }
*/
protected function initMink () {
// Set up the template cache used by the PhantomJS mink driver.
$path = $this -> tempFilesDirectory . DIRECTORY_SEPARATOR . 'browsertestbase-templatecache' ;
$this -> minkDefaultDriverArgs = [
'http://127.0.0.1:8510' ,
$path ,
];
if ( ! file_exists ( $path )) {
mkdir ( $path );
}
return parent :: initMink ();
}
2016-07-07 09:44:38 -07:00
/**
* { @ inheritdoc }
*/
protected function tearDown () {
// Wait for all requests to finish. It is possible that an AJAX request is
// still on-going.
$result = $this -> getSession () -> wait ( 5000 , '(typeof(jQuery)=="undefined" || (0 === jQuery.active && 0 === jQuery(\':animated\').length))' );
if ( ! $result ) {
// If the wait is unsuccessful, there may still be an AJAX request in
// progress. If we tear down now, then this AJAX request may fail with
// missing database tables, because tear down will have removed them. Rather
// than allow it to fail, throw an explicit exception now explaining what
// the problem is.
throw new \RuntimeException ( 'Unfinished AJAX requests whilst tearing down a test' );
}
parent :: tearDown ();
}
2016-04-20 09:56:34 -07:00
/**
* Asserts that the element with the given CSS selector is visible .
*
* @ param string $css_selector
* The CSS selector identifying the element to check .
* @ param string $message
* Optional message to show alongside the assertion .
2016-05-04 14:35:41 -07:00
*
* @ deprecated in Drupal 8.1 . x , will be removed before Drupal 8.3 . x . Use
* \Behat\Mink\Element\NodeElement :: isVisible () instead .
2016-04-20 09:56:34 -07:00
*/
protected function assertElementVisible ( $css_selector , $message = '' ) {
2016-06-02 15:56:09 -07:00
$this -> assertTrue ( $this -> getSession () -> getDriver () -> isVisible ( $this -> cssSelectToXpath ( $css_selector )), $message );
2016-04-20 09:56:34 -07:00
}
/**
* Asserts that the element with the given CSS selector is not visible .
*
* @ param string $css_selector
* The CSS selector identifying the element to check .
* @ param string $message
* Optional message to show alongside the assertion .
2016-05-04 14:35:41 -07:00
*
* @ deprecated in Drupal 8.1 . x , will be removed before Drupal 8.3 . x . Use
* \Behat\Mink\Element\NodeElement :: isVisible () instead .
2016-04-20 09:56:34 -07:00
*/
protected function assertElementNotVisible ( $css_selector , $message = '' ) {
2016-06-02 15:56:09 -07:00
$this -> assertFalse ( $this -> getSession () -> getDriver () -> isVisible ( $this -> cssSelectToXpath ( $css_selector )), $message );
2016-04-20 09:56:34 -07:00
}
/**
* Waits for the given time or until the given JS condition becomes TRUE .
*
* @ param string $condition
* JS condition to wait until it becomes TRUE .
* @ param int $timeout
* ( Optional ) Timeout in milliseconds , defaults to 1000.
* @ param string $message
* ( optional ) A message to display with the assertion . If left blank , a
* default message will be displayed .
*
* @ throws \PHPUnit_Framework_AssertionFailedError
*
* @ see \Behat\Mink\Driver\DriverInterface :: evaluateScript ()
*/
protected function assertJsCondition ( $condition , $timeout = 1000 , $message = '' ) {
$message = $message ? : " Javascript condition met: \n " . $condition ;
$result = $this -> getSession () -> getDriver () -> wait ( $timeout , $condition );
$this -> assertTrue ( $result , $message );
}
2016-07-07 09:44:38 -07:00
/**
* { @ inheritdoc }
*/
public function assertSession ( $name = NULL ) {
return new JSWebAssert ( $this -> getSession ( $name ), $this -> baseUrl );
}
2016-04-20 09:56:34 -07:00
}