MDL-35590 behat: Fixed navigation steps to support aria attributes

This commit is contained in:
Rajesh Taneja 2016-01-22 17:53:44 +08:00 committed by Simey Lameze
parent f889544657
commit 10ac8baf6e
2 changed files with 32 additions and 31 deletions

View file

@ -88,22 +88,10 @@ class behat_completion extends behat_base {
* @Given /^I go to the current course activity completion report$/ * @Given /^I go to the current course activity completion report$/
*/ */
public function go_to_the_current_course_activity_completion_report() { public function go_to_the_current_course_activity_completion_report() {
$completionnode = get_string('pluginname', 'report_progress');
$reportsnode = get_string('courseadministration') . ' > ' . get_string('reports');
$steps = array(); return new Given('I navigate to "' . $completionnode . '" node in "' . $reportsnode . '"');
// Expand reports node if we can't see the link.
try {
$this->find('xpath', "//div[@id='settingsnav']" .
"/descendant::li" .
"/descendant::li[not(contains(concat(' ', normalize-space(@class), ' '), ' collapsed '))]" .
"/descendant::p[contains(., '" . get_string('pluginname', 'report_progress') . "')]");
} catch (ElementNotFoundException $e) {
$steps[] = new Given('I expand "' . get_string('reports') . '" node');
}
$steps[] = new Given('I follow "' . get_string('pluginname', 'report_progress') . '"');
return $steps;
} }
/** /**

View file

@ -65,8 +65,8 @@ class behat_navigation extends behat_base {
$nodetextliteral = $this->getSession()->getSelectorsHandler()->xpathLiteral($text); $nodetextliteral = $this->getSession()->getSelectorsHandler()->xpathLiteral($text);
$hasblocktree = "[contains(concat(' ', normalize-space(@class), ' '), ' block_tree ')]"; $hasblocktree = "[contains(concat(' ', normalize-space(@class), ' '), ' block_tree ')]";
$hasbranch = "[contains(concat(' ', normalize-space(@class), ' '), ' branch ')]"; $hasbranch = "[contains(concat(' ', normalize-space(@class), ' '), ' branch ')]";
$hascollapsed = "li[contains(concat(' ', normalize-space(@class), ' '), ' collapsed ') or @data-expandable='1']"; $hascollapsed = "li[@aria-expanded='false']";
$notcollapsed = "li[not(contains(concat(' ', normalize-space(@class), ' '), ' collapsed '))]"; $notcollapsed = "li[@aria-expanded='true']";
$match = "[normalize-space(.)={$nodetextliteral}]"; $match = "[normalize-space(.)={$nodetextliteral}]";
// Avoid problems with quotes. // Avoid problems with quotes.
@ -79,12 +79,15 @@ class behat_navigation extends behat_base {
$iscollapsed = 'li'; $iscollapsed = 'li';
} }
// First check root nodes. // First check root nodes, it can be a span or link.
$xpath = "//ul{$hasblocktree}/$hascollapsed/p{$isbranch}/span{$match}|"; $xpath = "//ul{$hasblocktree}/$hascollapsed/p{$isbranch}/span{$match}|";
$xpath .= "//ul{$hasblocktree}/$hascollapsed/p{$isbranch}/a{$match}|";
// Next search for the node containing the text within a link. // Next search for the node containing the text within a link.
$xpath .= "//ul{$hasblocktree}//{$notcollapsed}/ul/{$iscollapsed}/p{$isbranch}/a{$match}|"; $xpath .= "//ul{$hasblocktree}//ul/{$iscollapsed}/p{$isbranch}/a{$match}|";
// Finally search for the node containing the text within a span. // Finally search for the node containing the text within a span.
$xpath .= "//ul{$hasblocktree}//{$notcollapsed}/ul/{$iscollapsed}/p{$isbranch}/span{$match}"; $xpath .= "//ul{$hasblocktree}//ul/{$iscollapsed}/p{$isbranch}/span{$match}";
$node = $this->find('xpath', $xpath, $exception); $node = $this->find('xpath', $xpath, $exception);
$this->ensure_node_is_visible($node); $this->ensure_node_is_visible($node);
@ -108,10 +111,11 @@ class behat_navigation extends behat_base {
$node = $this->get_node_text_node($nodetext, true); $node = $this->get_node_text_node($nodetext, true);
$node = $node->getParent(); $node = $node->getParent();
if ($node->hasAttribute('data-expandable') && $node->getAttribute('data-expandable')) { if ($node->hasClass('emptybranch')) {
return true; throw new ExpectationException('The "' . $nodetext . '" node is not expandable', $this->getSession());
} }
throw new ExpectationException('The "' . $nodetext . '" node is not expandable', $this->getSession());
return true;
} }
/** /**
@ -131,10 +135,11 @@ class behat_navigation extends behat_base {
$node = $this->get_node_text_node($nodetext); $node = $this->get_node_text_node($nodetext);
$node = $node->getParent(); $node = $node->getParent();
if ($node->hasAttribute('data-expandable') && $node->getAttribute('data-expandable')) {
throw new ExpectationException('The "' . $nodetext . '" node is expandable', $this->getSession()); if ($node->hasClass('emptybranch') || $node->hasClass('tree_item')) {
return true;
} }
return true; throw new ExpectationException('The "' . $nodetext . '" node is expandable', $this->getSession());
} }
/** /**
@ -257,7 +262,9 @@ class behat_navigation extends behat_base {
} }
// Keep expanding all sub-parents if js enabled. // Keep expanding all sub-parents if js enabled.
if ($this->running_javascript() && $node->hasClass('collapsed')) { if ($this->running_javascript() && $node->hasAttribute('aria-expanded') &&
($node->getAttribute('aria-expanded') == "false")) {
$xpath = "/p[contains(concat(' ', normalize-space(@class), ' '), ' tree_item ')]"; $xpath = "/p[contains(concat(' ', normalize-space(@class), ' '), ' tree_item ')]";
$nodetoexpand = $node->find('xpath', $xpath); $nodetoexpand = $node->find('xpath', $xpath);
@ -265,9 +272,9 @@ class behat_navigation extends behat_base {
$nodetoexpand->click(); $nodetoexpand->click();
// Wait for node to load, if not loaded before. // Wait for node to load, if not loaded before.
if ($nodetoexpand->hasAttribute('data-loaded') && $nodetoexpand->getAttribute('data-loaded') == 0) { if ($nodetoexpand->hasAttribute('data-loaded') && $nodetoexpand->getAttribute('data-loaded') == "false") {
$jscondition = '(document.evaluate("' . $nodetoexpand->getXpath() . '", document, null, '. $jscondition = '(document.evaluate("' . $nodetoexpand->getXpath() . '", document, null, '.
'XPathResult.ANY_TYPE, null).iterateNext().getAttribute(\'data-loaded\') == 1)'; 'XPathResult.ANY_TYPE, null).iterateNext().getAttribute(\'data-loaded\') == "true")';
$this->getSession()->wait(self::EXTENDED_TIMEOUT * 1000, $jscondition); $this->getSession()->wait(self::EXTENDED_TIMEOUT * 1000, $jscondition);
} }
@ -320,8 +327,14 @@ class behat_navigation extends behat_base {
"//div[contains(concat(' ', normalize-space(@class), ' '), ' content ')]/div" . "//div[contains(concat(' ', normalize-space(@class), ' '), ' content ')]/div" .
"/ul[contains(concat(' ', normalize-space(@class), ' '), ' block_tree ')]" . "/ul[contains(concat(' ', normalize-space(@class), ' '), ' block_tree ')]" .
"/li[p[contains(concat(' ', normalize-space(@class), ' '), ' branch ')]" . "/li[p[contains(concat(' ', normalize-space(@class), ' '), ' branch ')]" .
"/span[normalize-space(.)=" . $nodetextliteral ."]]"; "/span[normalize-space(.)=" . $nodetextliteral ."]]" .
$node = $this->find('xpath', $xpath, $exception); "|" .
"//div[contains(concat(' ', normalize-space(@class), ' '), ' content ')]/div" .
"/ul[contains(concat(' ', normalize-space(@class), ' '), ' block_tree ')]" .
"/li[p[contains(concat(' ', normalize-space(@class), ' '), ' branch ')]" .
"/a[normalize-space(.)=" . $nodetextliteral ."]]";
$node = $this->find('xpath', $xpath, $exception);
return $node; return $node;
} }