/**
* Gets elements within current page
* @param By $locator
* @param bool $polling
* @param int $elementId
* @throws Exceptions\InvalidSelector
* @return Nearsoft\SeleniumClient\WebElement[]
*/
public function findElements(By $locator, $polling = false, $elementId = -1)
{
if (strpos($locator->getStrategy(), 'js selector ') === 0) {
$function = substr($locator->getStrategy(), 12);
$script = "return typeof window.{$function};";
$valid = $this->executeScript($script) == 'function';
$selector = addslashes($locator->getSelectorValue());
if (!$valid) {
throw new Exceptions\InvalidSelector('The selectorElement is not defined');
}
if ($elementId >= 0) {
// todo refactor child selection strategy to separate classes
if (strpos($function, 'document.') === 0) {
// assume child.$function($selector)
$function = substr($function, 9);
$script = sprintf('return arguments[0].%s("%s")', $function, $selector);
} else {
// assume $function($selector, child)
$script = sprintf('return %s("%s", arguments[0])', $function, $selector);
}
$args = array(array('ELEMENT' => $elementId));
} else {
$script = sprintf('return %s("%s")', $function, $selector);
$args = array();
}
$params = array('script' => $script, 'args' => $args);
$command = new Commands\Command($this, 'execute_script', $params);
$results = $command->execute();
} else {
$params = array('using' => $locator->getStrategy(), 'value' => $locator->getSelectorValue());
if ($elementId >= 0) {
$command = new Commands\Command($this, 'elements_in_element', $params, array('element_id' => $elementId));
} else {
$command = new Commands\Command($this, 'elements', $params);
}
$results = $command->execute();
}
$webElements = array();
if (isset($results['value']) && is_array($results['value'])) {
foreach ($results['value'] as $element) {
$webElements[] = new WebElement($this, is_array($element) ? $element['ELEMENT'] : $element);
}
}
return $webElements ?: null;
}