Issue #3407834 by Spokje, quietone, andypost, justafish, alexpott, mondrake, longwave: Update behat/mink and friends

merge-requests/5983/merge
catch 2024-02-13 11:46:53 +00:00
parent fd75fa2134
commit 6d9a73fe7a
11 changed files with 162 additions and 61 deletions

View File

@ -15,9 +15,9 @@
"drupal/core-vendor-hardening": "self.version"
},
"require-dev": {
"behat/mink": "^1.10",
"behat/mink-browserkit-driver": "^2.1",
"behat/mink-selenium2-driver": "^1.4",
"behat/mink": "^1.11",
"behat/mink-browserkit-driver": "^2.2",
"behat/mink-selenium2-driver": "^1.7",
"colinodell/psr-testlogger": "^1.2",
"composer/composer": "^2.6.4",
"drupal/coder": "^8.3.10",

71
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "8817574eb861631d2d3562adf1af8480",
"content-hash": "a4fad5d4f1355f96a953849799e211f4",
"packages": [
{
"name": "asm89/stack-cors",
@ -4444,26 +4444,28 @@
"packages-dev": [
{
"name": "behat/mink",
"version": "v1.10.0",
"version": "v1.11.0",
"source": {
"type": "git",
"url": "https://github.com/minkphp/Mink.git",
"reference": "19e58905632e7cfdc5b2bafb9b950a3521af32c5"
"reference": "d8527fdf8785aad38455fb426af457ab9937aece"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/minkphp/Mink/zipball/19e58905632e7cfdc5b2bafb9b950a3521af32c5",
"reference": "19e58905632e7cfdc5b2bafb9b950a3521af32c5",
"url": "https://api.github.com/repos/minkphp/Mink/zipball/d8527fdf8785aad38455fb426af457ab9937aece",
"reference": "d8527fdf8785aad38455fb426af457ab9937aece",
"shasum": ""
},
"require": {
"php": ">=7.2",
"symfony/css-selector": "^4.4 || ^5.0 || ^6.0"
"symfony/css-selector": "^4.4 || ^5.0 || ^6.0 || ^7.0"
},
"require-dev": {
"phpstan/phpstan": "^1.10",
"phpstan/phpstan-phpunit": "^1.3",
"phpunit/phpunit": "^8.5.22 || ^9.5.11",
"symfony/error-handler": "^4.4 || ^5.0 || ^6.0",
"symfony/phpunit-bridge": "^5.4 || ^6.0"
"symfony/error-handler": "^4.4 || ^5.0 || ^6.0 || ^7.0",
"symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0"
},
"suggest": {
"behat/mink-browserkit-driver": "fast headless driver for any app without JS emulation",
@ -4502,37 +4504,40 @@
],
"support": {
"issues": "https://github.com/minkphp/Mink/issues",
"source": "https://github.com/minkphp/Mink/tree/v1.10.0"
"source": "https://github.com/minkphp/Mink/tree/v1.11.0"
},
"time": "2022-03-28T14:22:43+00:00"
"time": "2023-12-09T11:23:23+00:00"
},
{
"name": "behat/mink-browserkit-driver",
"version": "v2.1.0",
"version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/minkphp/MinkBrowserKitDriver.git",
"reference": "d2768e6c17b293d86d8fcff54cbb9e6ad938fee1"
"reference": "16d53476e42827ed3aafbfa4fde17a1743eafd50"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/d2768e6c17b293d86d8fcff54cbb9e6ad938fee1",
"reference": "d2768e6c17b293d86d8fcff54cbb9e6ad938fee1",
"url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/16d53476e42827ed3aafbfa4fde17a1743eafd50",
"reference": "16d53476e42827ed3aafbfa4fde17a1743eafd50",
"shasum": ""
},
"require": {
"behat/mink": "^1.9.0@dev",
"behat/mink": "^1.11.0@dev",
"ext-dom": "*",
"php": ">=7.2",
"symfony/browser-kit": "^4.4 || ^5.0 || ^6.0",
"symfony/dom-crawler": "^4.4 || ^5.0 || ^6.0"
"symfony/browser-kit": "^4.4 || ^5.0 || ^6.0 || ^7.0",
"symfony/dom-crawler": "^4.4 || ^5.0 || ^6.0 || ^7.0"
},
"require-dev": {
"mink/driver-testsuite": "dev-master",
"phpstan/phpstan": "^1.10",
"phpstan/phpstan-phpunit": "^1.3",
"phpunit/phpunit": "^8.5 || ^9.5",
"symfony/error-handler": "^4.4 || ^5.0 || ^6.0",
"symfony/http-client": "^4.4 || ^5.0 || ^6.0",
"symfony/http-kernel": "^4.4 || ^5.0 || ^6.0",
"symfony/mime": "^4.4 || ^5.0 || ^6.0",
"symfony/error-handler": "^4.4 || ^5.0 || ^6.0 || ^7.0",
"symfony/http-client": "^4.4 || ^5.0 || ^6.0 || ^7.0",
"symfony/http-kernel": "^4.4 || ^5.0 || ^6.0 || ^7.0",
"symfony/mime": "^4.4 || ^5.0 || ^6.0 || ^7.0",
"yoast/phpunit-polyfills": "^1.0"
},
"type": "mink-driver",
@ -4567,34 +4572,36 @@
],
"support": {
"issues": "https://github.com/minkphp/MinkBrowserKitDriver/issues",
"source": "https://github.com/minkphp/MinkBrowserKitDriver/tree/v2.1.0"
"source": "https://github.com/minkphp/MinkBrowserKitDriver/tree/v2.2.0"
},
"time": "2022-03-28T14:33:51+00:00"
"time": "2023-12-09T11:30:50+00:00"
},
{
"name": "behat/mink-selenium2-driver",
"version": "v1.6.0",
"version": "v1.7.0",
"source": {
"type": "git",
"url": "https://github.com/minkphp/MinkSelenium2Driver.git",
"reference": "e5f8421654930da725499fb92983e6948c6f973e"
"reference": "4ca4083f305de7dff4434ac402dc4e3f39c0866a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/e5f8421654930da725499fb92983e6948c6f973e",
"reference": "e5f8421654930da725499fb92983e6948c6f973e",
"url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/4ca4083f305de7dff4434ac402dc4e3f39c0866a",
"reference": "4ca4083f305de7dff4434ac402dc4e3f39c0866a",
"shasum": ""
},
"require": {
"behat/mink": "^1.9@dev",
"behat/mink": "^1.11@dev",
"ext-json": "*",
"instaclick/php-webdriver": "^1.4",
"instaclick/php-webdriver": "^1.4.14",
"php": ">=7.2"
},
"require-dev": {
"mink/driver-testsuite": "dev-master",
"phpstan/phpstan": "^1.10",
"phpstan/phpstan-phpunit": "^1.3",
"phpunit/phpunit": "^8.5.22 || ^9.5.11",
"symfony/error-handler": "^4.4 || ^5.0"
"symfony/error-handler": "^4.4 || ^5.0 || ^6.0 || ^7.0"
},
"type": "mink-driver",
"extra": {
@ -4635,9 +4642,9 @@
],
"support": {
"issues": "https://github.com/minkphp/MinkSelenium2Driver/issues",
"source": "https://github.com/minkphp/MinkSelenium2Driver/tree/v1.6.0"
"source": "https://github.com/minkphp/MinkSelenium2Driver/tree/v1.7.0"
},
"time": "2022-03-28T14:55:17+00:00"
"time": "2023-12-09T11:58:45+00:00"
},
{
"name": "colinodell/psr-testlogger",

View File

@ -7,9 +7,9 @@
"webflo/drupal-core-require-dev": "*"
},
"require": {
"behat/mink": "^1.10",
"behat/mink-browserkit-driver": "^2.1",
"behat/mink-selenium2-driver": "^1.4",
"behat/mink": "^1.11",
"behat/mink-browserkit-driver": "^2.2",
"behat/mink-selenium2-driver": "^1.7",
"colinodell/psr-testlogger": "^1.2",
"composer/composer": "^2.6.4",
"drupal/coder": "^8.3.10",

View File

@ -8,9 +8,9 @@
},
"require": {
"drupal/core": "11.x-dev",
"behat/mink": "v1.10.0",
"behat/mink-browserkit-driver": "v2.1.0",
"behat/mink-selenium2-driver": "v1.6.0",
"behat/mink": "v1.11.0",
"behat/mink-browserkit-driver": "v2.2.0",
"behat/mink-selenium2-driver": "v1.7.0",
"colinodell/psr-testlogger": "v1.3.0",
"composer/ca-bundle": "1.3.7",
"composer/class-map-generator": "1.1.0",

View File

@ -38,6 +38,8 @@ class BlockDragTest extends WebDriverTestBase {
* Tests drag and drop blocks.
*/
public function testDragAndDropBlocks() {
// Resize window to work around https://github.com/bitovi/syn/issues/164.
$this->getSession()->resizeWindow(1024, 2048);
$this->drupalGet('admin/structure/block');
$assertSession = $this->assertSession();
$session = $this->getSession();

View File

@ -115,7 +115,7 @@ class MediaEmbedFilterTestBase extends MediaJavascriptTestBase {
'filters[filter_align][status]' => TRUE,
'filters[filter_caption][status]' => TRUE,
'filters[filter_html_image_secure][status]' => TRUE,
'media_embed' => -5,
'media_embed' => '-5',
'allowed_html' => "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id> <drupal-media data-entity-type data-entity-uuid data-view-mode>",
'expected_error_message' => 'The Embed media filter needs to be placed after the following filters: Align images, Caption images, Restrict images to this site.',
],
@ -124,7 +124,7 @@ class MediaEmbedFilterTestBase extends MediaJavascriptTestBase {
'filters[filter_align][status]' => TRUE,
'filters[filter_caption][status]' => FALSE,
'filters[filter_html_image_secure][status]' => FALSE,
'media_embed' => -5,
'media_embed' => '-5',
'allowed_html' => '',
'expected_error_message' => 'The Embed media filter needs to be placed after the Align images filter.',
],
@ -133,7 +133,7 @@ class MediaEmbedFilterTestBase extends MediaJavascriptTestBase {
'filters[filter_align][status]' => FALSE,
'filters[filter_caption][status]' => TRUE,
'filters[filter_html_image_secure][status]' => FALSE,
'media_embed' => -5,
'media_embed' => '-5',
'allowed_html' => '',
'expected_error_message' => 'The Embed media filter needs to be placed after the Caption images filter.',
],
@ -142,7 +142,7 @@ class MediaEmbedFilterTestBase extends MediaJavascriptTestBase {
'filters[filter_align][status]' => FALSE,
'filters[filter_caption][status]' => FALSE,
'filters[filter_html_image_secure][status]' => TRUE,
'media_embed' => -5,
'media_embed' => '-5',
'allowed_html' => '',
'expected_error_message' => 'The Embed media filter needs to be placed after the Restrict images to this site filter.',
],
@ -151,7 +151,7 @@ class MediaEmbedFilterTestBase extends MediaJavascriptTestBase {
'filters[filter_align][status]' => TRUE,
'filters[filter_caption][status]' => TRUE,
'filters[filter_html_image_secure][status]' => TRUE,
'media_embed' => 5,
'media_embed' => '5',
'allowed_html' => "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id> <drupal-media data-entity-type data-entity-uuid data-view-mode>",
'expected_error_message' => 'The Embed media filter needs to be placed after the Restrict images to this site filter.',
],

View File

@ -192,10 +192,10 @@ class EntityReferenceWidgetTest extends MediaLibraryTestBase {
$assert_session->buttonExists('field_twin_media_settings_edit')->press();
$this->assertElementExistsAfterWait('css', '#field-twin-media .tabledrag-toggle-weight')->press();
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_one][weight]')->selectOption(0);
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_three][weight]')->selectOption(1);
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_four][weight]')->selectOption(2);
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_two][weight]')->selectOption(3);
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_one][weight]')->selectOption('0');
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_three][weight]')->selectOption('1');
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_four][weight]')->selectOption('2');
$assert_session->fieldExists('fields[field_twin_media][settings_edit_form][settings][media_types][type_two][weight]')->selectOption('3');
$assert_session->buttonExists('Save')->press();
$this->drupalGet('node/add/basic_page');

View File

@ -82,7 +82,7 @@ class PaginationAJAXTest extends WebDriverTestBase {
$this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']);
// Set the number of items displayed per page to 5 using the exposed pager.
$page->selectFieldOption('edit-items-per-page', 5);
$page->selectFieldOption('edit-items-per-page', '5');
$page->pressButton('Filter');
$session_assert->assertWaitOnAjaxRequest();
@ -166,7 +166,7 @@ class PaginationAJAXTest extends WebDriverTestBase {
$this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']);
// Set the number of items displayed per page to 5 using the exposed pager.
$page->selectFieldOption('edit-items-per-page', 5);
$page->selectFieldOption('edit-items-per-page', '5');
$page->pressButton('Filter');
$session_assert->assertWaitOnAjaxRequest();

View File

@ -6,6 +6,7 @@ namespace Drupal\FunctionalJavascriptTests;
use Behat\Mink\Driver\Selenium2Driver;
use Behat\Mink\Exception\DriverException;
use WebDriver\Element;
use WebDriver\Exception;
use WebDriver\Exception\UnknownError;
use WebDriver\ServiceFactory;
@ -144,12 +145,13 @@ class DrupalSelenium2Driver extends Selenium2Driver {
$not_clickable_exception = NULL;
$result = $this->waitFor(10, function () use (&$not_clickable_exception, $xpath, $value) {
try {
$element = $this->getWebDriverSession()->element('xpath', $xpath);
// \Behat\Mink\Driver\Selenium2Driver::setValue() will call .blur() on
// the element, modify that to trigger the "input" and "change" events
// instead. They indicate the value has changed, rather than implying
// user focus changes. This script only runs when Drupal javascript has
// been loaded.
$this->executeJsOnXpath($xpath, <<<JS
$this->executeJsOnElement($element, <<<JS
if (typeof Drupal !== 'undefined') {
var node = {{ELEMENT}};
var original = node.blur;
@ -165,6 +167,12 @@ if (typeof Drupal !== 'undefined') {
};
}
JS);
if (!is_string($value) && strtolower($element->name()) === 'input' && in_array(strtolower($element->attribute('type')), ['text', 'number', 'radio'], TRUE)) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
$value = (string) $value;
}
parent::setValue($xpath, $value);
return TRUE;
}
@ -231,4 +239,26 @@ JS);
}
}
/**
* Executes JS on a given element.
*
* @param \WebDriver\Element $element
* The webdriver element.
* @param string $script
* The script to execute.
*
* @return mixed
* The result of executing the script.
*/
private function executeJsOnElement(Element $element, string $script) {
$script = str_replace('{{ELEMENT}}', 'arguments[0]', $script);
$options = [
'script' => $script,
'args' => [$element],
];
return $this->getWebDriverSession()->execute($options);
}
}

View File

@ -84,14 +84,16 @@ trait UiHelperTrait {
foreach ($edit as $name => $value) {
$field = $assert_session->fieldExists($name, $form);
$value = match ($field->getAttribute('type')) {
// Provide support for the values '1' and '0' for checkboxes instead of
// TRUE and FALSE.
// @todo Get rid of supporting 1/0 by converting all tests cases using
// this to boolean values.
$field_type = $field->getAttribute('type');
if ($field_type === 'checkbox') {
$value = (bool) $value;
}
'checkbox' => (bool) $value,
// Mink only allows strings for text, number and radio button values.
'text', 'number', 'radio' => (string) $value,
default => $value,
};
$field->setValue($value);
}
@ -232,6 +234,16 @@ trait UiHelperTrait {
$this->prepareRequest();
foreach ($headers as $header_name => $header_value) {
if (is_int($header_name)) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
[$header_name, $header_value] = explode(':', $header_value);
}
if (is_null($header_value)) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
$header_value = '';
}
$session->setRequestHeader($header_name, $header_value);
}

View File

@ -139,6 +139,11 @@ class WebAssert extends MinkWebAssert {
* When the element doesn't exist.
*/
public function buttonExists($button, TraversableElement $container = NULL) {
if (!is_string($button)) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
$button = (string) $button;
}
$container = $container ?: $this->session->getPage();
$node = $container->findButton($button);
@ -918,4 +923,49 @@ class WebAssert extends MinkWebAssert {
return $selector;
}
/**
* {@inheritdoc}
*/
public function responseHeaderEquals($name, $value) {
if (!is_string($name)) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
$name = (string) $name;
}
if ($value === NULL) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
$this->responseHeaderDoesNotExist($name);
return;
}
if (!is_string($value)) {
$value = (string) $value;
}
parent::responseHeaderEquals($name, $value);
}
/**
* {@inheritdoc}
*/
public function pageTextContains($text) {
if (!is_string($text)) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
$text = (string) $text;
}
parent::pageTextContains($text);
}
/**
* {@inheritdoc}
*/
public function fieldValueEquals(string $field, $value, TraversableElement $container = NULL) {
if (!is_string($value)) {
// @todo Trigger deprecation in
// https://www.drupal.org/project/drupal/issues/3421105.
$value = (string) $value;
}
parent::fieldValueEquals($field, $value, $container);
}
}