Skip to content

Commit

Permalink
ENH Allow clicking on text directly in an element
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 committed Nov 25, 2024
1 parent 97f5092 commit 7faf94d
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 7faf94d

Please sign in to comment.