/** * 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; }