mirror of
https://github.com/moodle/moodle.git
synced 2025-08-08 10:26:40 +02:00
Merge branch 'MDL-76169-master' of https://github.com/andrewnicols/moodle
This commit is contained in:
commit
add46e3112
42 changed files with 462 additions and 395 deletions
|
@ -224,6 +224,22 @@ trait behat_session_trait {
|
|||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a description of the selector and locator to use in an exception message.
|
||||
*
|
||||
* @param string $selector The type of locator
|
||||
* @param mixed $locator The locator text
|
||||
* @return string
|
||||
*/
|
||||
protected function get_selector_description(string $selector, $locator): string {
|
||||
if ($selector === 'NodeElement') {
|
||||
$description = $locator->getText();
|
||||
return "'{$description}' {$selector}";
|
||||
}
|
||||
|
||||
return "'{$locator}' {$selector}";
|
||||
}
|
||||
|
||||
/**
|
||||
* Send key presses straight to the currently active element.
|
||||
*
|
||||
|
|
|
@ -86,6 +86,7 @@ class behat_partial_named_selector extends \Behat\Mink\Selector\PartialNamedSele
|
|||
*/
|
||||
protected static $allowedselectors = array(
|
||||
'activity' => 'activity',
|
||||
'actionmenu' => 'actionmenu',
|
||||
'badge' => 'badge',
|
||||
'block' => 'block',
|
||||
'button' => 'button',
|
||||
|
@ -138,6 +139,17 @@ class behat_partial_named_selector extends \Behat\Mink\Selector\PartialNamedSele
|
|||
protected static $moodleselectors = array(
|
||||
'activity' => <<<XPATH
|
||||
.//li[contains(concat(' ', normalize-space(@class), ' '), ' activity ')][descendant::*[contains(normalize-space(.), %locator%)]]
|
||||
XPATH
|
||||
, 'actionmenu' => <<<XPATH
|
||||
.//*[
|
||||
contains(concat(' ', normalize-space(@class), ' '), ' action-menu ')
|
||||
and
|
||||
descendant::*[
|
||||
contains(concat(' ', normalize-space(@class), ' '), ' dropdown-toggle ')
|
||||
and
|
||||
contains(normalize-space(.), %locator%)
|
||||
]
|
||||
]
|
||||
XPATH
|
||||
, 'badge' => <<<XPATH
|
||||
.//span[(contains(@class, 'badge')) and text()[contains(., %locator%)]]
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
|
||||
require_once(__DIR__ . '/../../behat/behat_base.php');
|
||||
|
||||
use Behat\Mink\Exception\ExpectationException as ExpectationException;
|
||||
use Behat\Mink\Exception\DriverException as DriverException;
|
||||
use Behat\Mink\Element\NodeElement;
|
||||
use Behat\Mink\Exception\DriverException;
|
||||
|
||||
/**
|
||||
* Steps definitions to open and close action menus.
|
||||
|
@ -83,4 +83,122 @@ class behat_action_menu extends behat_base {
|
|||
$this->ensure_node_is_visible($node);
|
||||
$node->click();
|
||||
}
|
||||
|
||||
/**
|
||||
* Select a specific item in an action menu.
|
||||
*
|
||||
* @When /^I choose the "(?P<item_string>(?:[^"]|\\")*)" item in the "(?P<actionmenu_string>(?:[^"]|\\")*)" action menu$/
|
||||
* @param string $item The item to choose
|
||||
* @param string $actionmenu The text used in the description of the action menu
|
||||
*/
|
||||
public function i_choose_in_the_named_menu(string $item, string $actionmenu): void {
|
||||
$menu = $this->find('actionmenu', $actionmenu);
|
||||
$this->select_item_in_action_menu($item, $menu);
|
||||
}
|
||||
|
||||
/**
|
||||
* Select a specific item in an action menu within a container.
|
||||
*
|
||||
* @When /^I choose the "(?P<item_string>(?:[^"]|\\")*)" item in the "(?P<actionmenu_string>(?:[^"]|\\")*)" action menu of the "(?P<locator_string>(?:[^"]|\\")*)" "(?P<type_string>(?:[^"]|\\")*)"$/
|
||||
* @param string $item The item to choose
|
||||
* @param string $actionmenu The text used in the description of the action menu
|
||||
* @param string|NodeElement $locator The identifer used for the container
|
||||
* @param string $selector The type of container to locate
|
||||
*/
|
||||
public function i_choose_in_the_named_menu_in_container(string $item, string $actionmenu, $locator, $selector): void {
|
||||
$container = $this->find($selector, $locator);
|
||||
$menu = $this->find('actionmenu', $actionmenu, false, $container);
|
||||
$this->select_item_in_action_menu($item, $menu);
|
||||
}
|
||||
|
||||
/**
|
||||
* Select an item in the specified menu.
|
||||
*
|
||||
* Note: This step does work both with, and without, JavaScript.
|
||||
*
|
||||
* @param string $item Item string value
|
||||
* @param NodeElement $menu The menu NodeElement to select from
|
||||
*/
|
||||
protected function select_item_in_action_menu(string $item, NodeElement $menu): void {
|
||||
if ($this->running_javascript()) {
|
||||
// Open the menu by clicking on the trigger.
|
||||
$this->execute(
|
||||
'behat_general::i_click_on',
|
||||
[$menu, "NodeElement"]
|
||||
);
|
||||
}
|
||||
|
||||
// Select the menu item.
|
||||
$this->execute(
|
||||
'behat_general::i_click_on_in_the',
|
||||
[$item, "link", $menu, "NodeElement"]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The action menu item should not exist.
|
||||
*
|
||||
* @Then /^the "(?P<item_string>(?:[^"]|\\")*)" item should not exist in the "(?P<actionmenu_string>(?:[^"]|\\")*)" action menu$/
|
||||
* @param string $item The item to check
|
||||
* @param string $actionmenu The text used in the description of the action menu
|
||||
*/
|
||||
public function item_should_not_exist(string $item, string $actionmenu): void {
|
||||
$menu = $this->find('actionmenu', $actionmenu);
|
||||
$this->execute('behat_general::should_not_exist_in_the', [
|
||||
$item, 'link',
|
||||
$menu, 'NodeElement'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* The action menu item should not exist within a container.
|
||||
*
|
||||
* @Then /^the "(?P<item_string>(?:[^"]|\\")*)" item should not exist in the "(?P<actionmenu_string>(?:[^"]|\\")*)" action menu of the "(?P<locator_string>(?:[^"]|\\")*)" "(?P<type_string>(?:[^"]|\\")*)"$/
|
||||
* @param string $item The item to check
|
||||
* @param string $actionmenu The text used in the description of the action menu
|
||||
* @param string|NodeElement $locator The identifer used for the container
|
||||
* @param string $selector The type of container to locate
|
||||
*/
|
||||
public function item_should_not_exist_in_the(string $item, string $actionmenu, $locator, $selector): void {
|
||||
$container = $this->find($selector, $locator);
|
||||
$menu = $this->find('actionmenu', $actionmenu, false, $container);
|
||||
$this->execute('behat_general::should_not_exist_in_the', [
|
||||
$item, 'link',
|
||||
$menu, 'NodeElement'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The action menu item should exist.
|
||||
*
|
||||
* @Then /^the "(?P<item_string>(?:[^"]|\\")*)" item should exist in the "(?P<actionmenu_string>(?:[^"]|\\")*)" action menu$/
|
||||
* @param string $item The item to check
|
||||
* @param string $actionmenu The text used in the description of the action menu
|
||||
*/
|
||||
public function item_should_exist(string $item, string $actionmenu): void {
|
||||
$menu = $this->find('actionmenu', $actionmenu);
|
||||
$this->execute('behat_general::should_exist_in_the', [
|
||||
$item, 'link',
|
||||
$menu, 'NodeElement'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* The action menu item should exist within a container.
|
||||
*
|
||||
* @Then /^the "(?P<item_string>(?:[^"]|\\")*)" item should exist in the "(?P<actionmenu_string>(?:[^"]|\\")*)" action menu of the "(?P<locator_string>(?:[^"]|\\")*)" "(?P<type_string>(?:[^"]|\\")*)"$/
|
||||
* @param string $item The item to check
|
||||
* @param string $actionmenu The text used in the description of the action menu
|
||||
* @param string|NodeElement $locator The identifer used for the container
|
||||
* @param string $selector The type of container to locate
|
||||
*/
|
||||
public function item_should_exist_in_the(string $item, string $actionmenu, $locator, $selector): void {
|
||||
$container = $this->find($selector, $locator);
|
||||
$menu = $this->find('actionmenu', $actionmenu, false, $container);
|
||||
$this->execute('behat_general::should_exist_in_the', [
|
||||
$item, 'link',
|
||||
$menu, 'NodeElement'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1225,7 +1225,8 @@ EOF;
|
|||
$containernode = $this->find($containerselectortype, $containerelement);
|
||||
|
||||
// Specific exception giving info about where can't we find the element.
|
||||
$locatorexceptionmsg = "{$element} in the {$containerelement} {$containerselectortype}";
|
||||
$containerdescription = $this->get_selector_description($containerselectortype, $containerelement);
|
||||
$locatorexceptionmsg = "{$element} not found in the {$containerdescription}}";
|
||||
$exception = new ElementNotFoundException($this->getSession(), $selectortype, null, $locatorexceptionmsg);
|
||||
|
||||
// Looks for the requested node inside the container node.
|
||||
|
@ -1259,8 +1260,10 @@ EOF;
|
|||
}
|
||||
|
||||
// The element was found and should not have been. Throw an exception.
|
||||
$elementdescription = $this->get_selector_description($selectortype, $element);
|
||||
$containerdescription = $this->get_selector_description($containerselectortype, $containerelement);
|
||||
throw new ExpectationException(
|
||||
"The '{$element}' '{$selectortype}' exists in the '{$containerelement}' '{$containerselectortype}'",
|
||||
"The {$elementdescription} exists in the {$containerdescription}",
|
||||
$this->getSession()
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue