| Línea 165... |
Línea 165... |
| 165 |
// we should not fail a test because of this. We continue if there are not expandable fields.
|
165 |
// we should not fail a test because of this. We continue if there are not expandable fields.
|
| 166 |
}
|
166 |
}
|
| Línea 167... |
Línea 167... |
| 167 |
|
167 |
|
| 168 |
// Different try & catch as we can have expanded fieldsets with advanced fields on them.
|
168 |
// Different try & catch as we can have expanded fieldsets with advanced fields on them.
|
| 169 |
try {
|
- |
|
| - |
|
169 |
try {
|
| 170 |
|
170 |
$this->wait_for_pending_js();
|
| 171 |
// Expand all fields xpath.
|
171 |
// Expand all fields xpath.
|
| 172 |
$showmorexpath = "//a[normalize-space(.)='" . get_string('showmore', 'form') . "']" .
|
172 |
$showmorexpath = "//a[normalize-space(.)='" . get_string('showmore', 'form') . "']" .
|
| Línea 173... |
Línea 173... |
| 173 |
"[contains(concat(' ', normalize-space(@class), ' '), ' moreless-toggler')]";
|
173 |
"[contains(concat(' ', normalize-space(@class), ' '), ' moreless-toggler')]";
|
| 174 |
|
174 |
|
| 175 |
// We don't wait here as we already waited when getting the expand fieldsets links.
|
175 |
// We don't wait here as we already waited when getting the expand fieldsets links.
|
| 176 |
if (!$showmores = $this->getSession()->getPage()->findAll('xpath', $showmorexpath)) {
|
176 |
if (!$showmores = $this->getSession()->getPage()->findAll('xpath', $showmorexpath)) {
|
| Línea 177... |
Línea 177... |
| 177 |
return;
|
177 |
return;
|
| 178 |
}
|
178 |
}
|
| 179 |
|
179 |
|
| 180 |
if ($this->getSession()->getDriver() instanceof \DMore\ChromeDriver\ChromeDriver) {
|
180 |
$js = <<<EOF
|
| 181 |
// Chrome Driver produces unique xpaths for each element.
|
- |
|
| 182 |
foreach ($showmores as $showmore) {
|
- |
|
| 183 |
$showmore->click();
|
181 |
require(['core/pending'], function(Pending) {
|
| 184 |
}
|
182 |
const query = document.evaluate("{$showmorexpath}", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
| 185 |
} else {
|
183 |
if (query.snapshotLength > 0) {
|
| 186 |
// Funny thing about this, with findAll() we specify a pattern and each element matching the pattern
|
184 |
const pendingPromise = new Pending('showmore:expand');
|
| 187 |
// is added to the array with of xpaths with a [0], [1]... sufix, but when we click on an element it
|
185 |
for (let i = 0, length = query.snapshotLength; i < length; ++i) {
|
| 188 |
// does not matches the specified xpath anymore (now is a "Show less..." link) so [1] becomes [0],
|
186 |
query.snapshotItem(i).click();
|
| 189 |
// that's why we always click on the first XPath match, will be always the next one.
|
187 |
if (i === length - 1) {
|
| 190 |
$iterations = count($showmores);
|
188 |
pendingPromise.resolve();
|
| 191 |
for ($i = 0; $i < $iterations; $i++) {
|
189 |
}
|
| - |
|
190 |
}
|
| Línea -... |
Línea 191... |
| - |
|
191 |
}
|
| - |
|
192 |
});
|
| 192 |
$showmores[0]->click();
|
193 |
EOF;
|
| 193 |
}
|
194 |
|
| 194 |
}
|
195 |
$this->execute_script($js);
|
| Línea 195... |
Línea 196... |
| 195 |
|
196 |
$this->wait_for_pending_js();
|
| Línea 832... |
Línea 833... |
| 832 |
"The select menu should contain \"{$option}\" but it does not.",
|
833 |
"The select menu should contain \"{$option}\" but it does not.",
|
| 833 |
$this->getSession()
|
834 |
$this->getSession()
|
| 834 |
);
|
835 |
);
|
| 835 |
}
|
836 |
}
|
| 836 |
}
|
837 |
}
|
| - |
|
838 |
|
| - |
|
839 |
/**
|
| - |
|
840 |
* Check that the validationMessage property on a form field element includes the given text.
|
| - |
|
841 |
*
|
| - |
|
842 |
* @Then the :field field validation message should contain :text
|
| - |
|
843 |
* @param string $field The css selector for the input field
|
| - |
|
844 |
* @param string $text The text which should be found in the validation message
|
| - |
|
845 |
*/
|
| - |
|
846 |
public function the_field_validation_message_should_contain(string $field, string $text): void {
|
| - |
|
847 |
|
| - |
|
848 |
// We can't use this assertion if javascript is not running.
|
| - |
|
849 |
$this->require_javascript();
|
| - |
|
850 |
|
| - |
|
851 |
// Check that the element exists.
|
| - |
|
852 |
// This is fail and go no further, if the element does not exist.
|
| - |
|
853 |
$node = $this->get_selected_node('field', $field);
|
| - |
|
854 |
|
| - |
|
855 |
// Get the validity result.
|
| - |
|
856 |
$wdelement = $this->get_webdriver_element_from_node_element($node);
|
| - |
|
857 |
$webdriver = $this->getSession()->getDriver()->getWebDriver();
|
| - |
|
858 |
$message = $webdriver->executeScript("return arguments[0].validationMessage;", [$wdelement]);
|
| - |
|
859 |
if (strpos($message, $text) === false) {
|
| - |
|
860 |
throw new ExpectationException(
|
| - |
|
861 |
'"' . $field . '" validation message does not contain "' . $text . '"', $this->getSession()
|
| - |
|
862 |
);
|
| - |
|
863 |
}
|
| - |
|
864 |
|
| - |
|
865 |
}
|
| - |
|
866 |
|
| - |
|
867 |
/**
|
| - |
|
868 |
* Check that the result of calling the checkValidity API on a form field element matches the expected result.
|
| - |
|
869 |
*
|
| - |
|
870 |
* @Then the :field field validity check should return :result
|
| - |
|
871 |
* @param string $field The css selector for the input field
|
| - |
|
872 |
* @param string $expected "true" or "false"
|
| - |
|
873 |
*/
|
| - |
|
874 |
public function the_field_validity_check_should_return(string $field, string $expected): void {
|
| - |
|
875 |
|
| - |
|
876 |
// We can't use this assertion if javascript is not running.
|
| - |
|
877 |
$this->require_javascript();
|
| - |
|
878 |
|
| - |
|
879 |
// Expected value can only be 'true' or 'false'.
|
| - |
|
880 |
$expected = strtolower($expected);
|
| - |
|
881 |
if (!in_array($expected, ['true', 'false'])) {
|
| - |
|
882 |
throw new ExpectationException(
|
| - |
|
883 |
'Invalid value for expected value "' . $expected . '". Should be "true" or "false".',
|
| - |
|
884 |
$this->getSession());
|
| - |
|
885 |
}
|
| - |
|
886 |
|
| - |
|
887 |
// Convert the expected result from a string to bool.
|
| - |
|
888 |
$expected = ($expected === "true");
|
| - |
|
889 |
|
| - |
|
890 |
// Check that the element exists.
|
| - |
|
891 |
// This is fail and go no further, if the element does not exist.
|
| - |
|
892 |
$node = $this->get_selected_node('field', $field);
|
| - |
|
893 |
|
| - |
|
894 |
// Get the validity result.
|
| - |
|
895 |
$wdelement = $this->get_webdriver_element_from_node_element($node);
|
| - |
|
896 |
$webdriver = $this->getSession()->getDriver()->getWebDriver();
|
| - |
|
897 |
$result = $webdriver->executeScript("return arguments[0].checkValidity();", [$wdelement]);
|
| - |
|
898 |
if ($result !== $expected) {
|
| - |
|
899 |
|
| - |
|
900 |
// Convert booleans to strings for the exception message.
|
| - |
|
901 |
$result = ($result) ? "true" : "false";
|
| - |
|
902 |
$expected = ($expected) ? "true" : "false";
|
| - |
|
903 |
|
| - |
|
904 |
throw new ExpectationException(
|
| - |
|
905 |
'"' . $field . '" validation check was "' . $result . '". Expected: "' .
|
| - |
|
906 |
$expected . '"', $this->getSession()
|
| - |
|
907 |
);
|
| - |
|
908 |
|
| - |
|
909 |
}
|
| - |
|
910 |
|
| - |
|
911 |
}
|
| - |
|
912 |
|
| 837 |
}
|
913 |
}
|