Merge branch 'MDL-75067-405' of https://github.com/paulholden/moodle into MOODLE_405_STABLE

This commit is contained in:
Ilya Tregubov
2026-03-18 14:03:02 +01:00
4 changed files with 34 additions and 34 deletions
@@ -0,0 +1,8 @@
issueNumber: MDL-75067
notes:
tool_behat:
- message: >-
The `behat_session_trait::ensure_element_[does_not_]exists(...)` methods
now accept optional `$container` parameter to define the parent node to
look within
type: improved
+3 -1
View File
@@ -35,10 +35,12 @@ Feature: Test if the login form provides the correct feedback
Given I log in as "admin"
And I navigate to "Appearance > Logos" in site administration
And I upload "course/tests/fixtures/image.jpg" file to "Logo" filemanager
And I upload "course/tests/fixtures/image.jpg" file to "Favicon" filemanager
And I press "Save changes"
And I log out
And I follow "Log in"
Then "//img[@id='logoimage']" "xpath_element" should exist
Then "//img[@id='logoimage' and contains(@src, '/image.jpg')]" "xpath_element" should exist
And "//link[@rel='shortcut icon' and contains(@href, '/image.jpg')]" "xpath_element" should exist
Scenario: Add a custom welcome message
Given the following config values are set as admin:
+6 -6
View File
@@ -571,9 +571,9 @@ trait behat_session_trait {
* @throws ExpectationException
* @param string $locator
* @param string $selectortype
* @return void
* @param NodeElement $container Restrict the search to just children of the specified container
*/
protected function ensure_element_exists($locator, $selectortype) {
protected function ensure_element_exists($locator, $selectortype, $container = false) {
// Exception if it timesout and the element is still there.
$msg = "The '{$locator}' element does not exist and should";
$exception = new ExpectationException($msg, $this->getSession());
@@ -583,7 +583,7 @@ trait behat_session_trait {
'selector' => $selector,
'locator' => $locator,
'container' => $container,
] = $this->normalise_selector($selectortype, $locator, $this->getSession()->getPage());
] = $this->normalise_selector($selectortype, $locator, $container ?: $this->getSession()->getPage());
// It will stop spinning once the find() method returns true.
$this->spin(
@@ -606,9 +606,9 @@ trait behat_session_trait {
* @throws ExpectationException
* @param string $locator
* @param string $selectortype
* @return void
* @param NodeElement $container Restrict the search to just children of the specified container
*/
protected function ensure_element_does_not_exist($locator, $selectortype) {
protected function ensure_element_does_not_exist($locator, $selectortype, $container = false) {
// Exception if it timesout and the element is still there.
$msg = "The '{$locator}' element exists and should not exist";
$exception = new ExpectationException($msg, $this->getSession());
@@ -618,7 +618,7 @@ trait behat_session_trait {
'selector' => $selector,
'locator' => $locator,
'container' => $container,
] = $this->normalise_selector($selectortype, $locator, $this->getSession()->getPage());
] = $this->normalise_selector($selectortype, $locator, $container ?: $this->getSession()->getPage());
// It will stop spinning once the find() method returns false.
$this->spin(
+17 -27
View File
@@ -14,6 +14,12 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
require_once(__DIR__ . '/behat_base.php');
use Behat\Mink\Exception\ExpectationException;
use Behat\Mink\Element\NodeElement;
/**
* Files interactions with behat.
*
@@ -25,25 +31,6 @@
* @copyright 2013 David Monllaó
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
require_once(__DIR__ . '/behat_base.php');
use Behat\Mink\Exception\ExpectationException as ExpectationException,
Behat\Mink\Element\NodeElement as NodeElement;
/**
* Files-related actions.
*
* Steps definitions related with filepicker or repositories should extend use this trait as it provides useful methods
* to deal with the common filepicker issues.
*
* @package core
* @category test
* @copyright 2013 David Monllaó
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
trait core_behat_file_helper {
/**
@@ -174,10 +161,8 @@ trait core_behat_file_helper {
* @throws ExpectationException Thrown by behat_base::find
* @param NodeElement $filemanagernode The filemanager or filepicker form element DOM node.
* @param mixed $repositoryname The repo name.
* @return void
*/
protected function open_add_file_window($filemanagernode, $repositoryname) {
$exception = new ExpectationException('No files can be added to the specified filemanager', $this->getSession());
// We should deal with single-file and multiple-file filemanagers,
// catching the exception thrown by behat_base::find() in case is not multiple
@@ -186,13 +171,17 @@ trait core_behat_file_helper {
$filemanagernode, 'NodeElement'
]);
$filepickerdialogue = $this->find('dialogue', get_string('filepicker', 'core_repository'));
// Wait for the default repository (if any) to load. This checks that
// the relevant div exists and that it does not include the loading image.
$this->ensure_element_exists(
"//div[contains(concat(' ', normalize-space(@class), ' '), ' file-picker ')]" .
"//div[contains(concat(' ', normalize-space(@class), ' '), ' fp-content ')]" .
"[not(descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' fp-content-loading ')])]",
'xpath_element');
"//div[contains(concat(' ', normalize-space(@class), ' '), ' file-picker ')]" .
"//div[contains(concat(' ', normalize-space(@class), ' '), ' fp-content ')]" .
"[not(descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' fp-content-loading ')])]",
'xpath_element',
$filepickerdialogue,
);
// Getting the repository link and opening it.
$repoexception = new ExpectationException('The "' . $repositoryname . '" repository has not been found', $this->getSession());
@@ -200,13 +189,14 @@ trait core_behat_file_helper {
// Avoid problems with both double and single quotes in the same string.
$repositoryname = behat_context_helper::escape($repositoryname);
// Here we don't need to look inside the selected element because there can only be one modal window.
// Select the repository link from inside the current filepicker dialogue.
$repositorylink = $this->find(
'xpath',
"//div[contains(concat(' ', normalize-space(@class), ' '), ' fp-repo-area ')]" .
"//descendant::span[contains(concat(' ', normalize-space(@class), ' '), ' fp-repo-name ')]" .
"[normalize-space(.)=$repositoryname]",
$repoexception
$repoexception,
$filepickerdialogue,
);
// Selecting the repo.