Skip to content

Commit

Permalink
ENH Allow clicking on text directly in an element (#290)
Browse files Browse the repository at this point in the history
This resolves situations where the text in a child element gets confused
with text in the element we want to click and results in errors finding
the correct element.
  • Loading branch information
GuySartorelli authored Nov 26, 2024
1 parent 97f5092 commit 3e4bb89
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/Context/BasicContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -496,12 +496,13 @@ public function iClickOnTheElementConfirmingTheDialog($selector)
}

/**
* @Given /^I (click|double click) "([^"]*)" in the "([^"]*)" element$/
* @Given /^I (click|double click) "([^"]*)"(| directly) in the "([^"]*)" element$/
* @param string $clickType
* @param string $text
* @param string $directly If used, the text must be directly in the element. Otherwise it can be in a child element.
* @param string $selector
*/
public function iClickInTheElement($clickType, $text, $selector)
public function iClickInTheElement($clickType, $text, $directly, $selector)
{
$clickTypeMap = array(
"double click" => "doubleclick",
Expand All @@ -510,7 +511,13 @@ public function iClickInTheElement($clickType, $text, $selector)
$page = $this->getSession()->getPage();
$parentElement = $page->find('css', $selector);
Assert::assertNotNull($parentElement, sprintf('"%s" element not found', $selector));
$element = $parentElement->find('xpath', sprintf('//*[count(*)=0 and contains(.,"%s")]', $text));
if ($directly) {
// Finds the specific text within the selector element (to validate it's there), and then grabs the element that holds the text
$element = $parentElement->find('xpath', sprintf('/text()[contains(.,"%s")]/..', $text));
} else {
// Finds a child of the selector element which contains the text
$element = $parentElement->find('xpath', sprintf('//*[count(*)=0 and contains(.,"%s")]', $text));
}
Assert::assertNotNull($element, sprintf('"%s" not found', $text));
$clickTypeFn = $clickTypeMap[$clickType];
$element->$clickTypeFn();
Expand Down

0 comments on commit 3e4bb89

Please sign in to comment.