forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
119 lines
3.4 KiB
PHP
119 lines
3.4 KiB
PHP
<?php
|
|
|
|
// phpcs:ignoreFile Portions of this file are a direct copy of
|
|
// \Behat\Mink\Element\DocumentElement which uses a different code style than
|
|
// Drupal.
|
|
|
|
namespace Drupal\Tests;
|
|
|
|
use Behat\Mink\Driver\BrowserKitDriver;
|
|
use Behat\Mink\Element\Element;
|
|
use Behat\Mink\Element\TraversableElement;
|
|
use Drupal\FunctionalJavascriptTests\WebDriverCurlService;
|
|
use WebDriver\Exception;
|
|
|
|
/**
|
|
* Document element.
|
|
*
|
|
* This is largely a copy of \Behat\Mink\Element\DocumentElement. This fixes the
|
|
* ::getText() method to remove script tags inside the body element.
|
|
*
|
|
* @see \Behat\Mink\Element\DocumentElement
|
|
* @internal
|
|
*/
|
|
class DocumentElement extends TraversableElement {
|
|
|
|
/**
|
|
* Returns XPath for handled element.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getXpath() {
|
|
return '//html';
|
|
}
|
|
|
|
/**
|
|
* Returns document content.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getContent() {
|
|
return trim($this->getDriver()->getContent());
|
|
}
|
|
|
|
/**
|
|
* Check whether document has specified content.
|
|
*
|
|
* @param string $content
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasContent($content) {
|
|
return $this->has('named', ['content', $content]);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getText() {
|
|
if ($this->getDriver() instanceof BrowserKitDriver) {
|
|
// Work around https://github.com/minkphp/MinkBrowserKitDriver/issues/153.
|
|
// To simulate what the user sees, it removes:
|
|
// - all text inside the head tags
|
|
// - Drupal settings json.
|
|
$raw_content = preg_replace([
|
|
'@<head>(.+?)</head>@si',
|
|
'@<script type="application/json" data-drupal-selector="drupal-settings-json">([^<]*)</script>@',
|
|
], '', $this->getContent());
|
|
// Filter out all HTML tags, as they are not visible in a normal browser.
|
|
$text = strip_tags($raw_content);
|
|
// To preserve BC and match \Behat\Mink\Element\Element::getText() include
|
|
// the page title.
|
|
$title_element = $this->find('css', 'title');
|
|
if ($title_element) {
|
|
$text = $title_element->getText() . ' ' . $text;
|
|
}
|
|
// To match what the user sees and \Behat\Mink\Element\Element::getText()
|
|
// decode HTML entities.
|
|
$text = html_entity_decode($text, ENT_QUOTES);
|
|
// To match \Behat\Mink\Element\Element::getText() remove new lines and
|
|
// normalize spaces.
|
|
$text = str_replace("\n", ' ', $text);
|
|
$text = preg_replace('/ {2,}/', ' ', $text);
|
|
return trim($text);
|
|
}
|
|
|
|
// If using a real browser fallback to the \Behat\Mink\Element\Element
|
|
// implementation.
|
|
return parent::getText();
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function waitFor($timeout, $callback) {
|
|
// Wraps waits in a function to catch curl exceptions to continue waiting.
|
|
WebDriverCurlService::disableRetry();
|
|
$count = 0;
|
|
$wrapper = function (Element $element) use ($callback, &$count) {
|
|
$count++;
|
|
try {
|
|
return call_user_func($callback, $element);
|
|
}
|
|
catch (Exception $e) {
|
|
return NULL;
|
|
}
|
|
};
|
|
$result = parent::waitFor($timeout, $wrapper);
|
|
if (!$result && $count < 2) {
|
|
// If the callback or the system is really slow, then it might have only
|
|
// fired once. In this case it is better to trigger it once more as the
|
|
// page state has probably changed while the callback is running.
|
|
return call_user_func($callback, $this);
|
|
}
|
|
WebDriverCurlService::enableRetry();
|
|
return $result;
|
|
}
|
|
|
|
}
|