123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <?php
- /**
- * Copyright 2004-2017 Facebook. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @package WebDriver
- *
- * @author Justin Bishop <jubishop@gmail.com>
- * @author Anthon Pang <apang@softwaredevelopment.ca>
- * @author Fabrizio Branca <mail@fabrizio-branca.de>
- */
- namespace WebDriver;
- use WebDriver\Exception as WebDriverException;
- /**
- * Abstract WebDriver\Container class
- *
- * @package WebDriver
- */
- abstract class Container extends AbstractWebDriver
- {
- /**
- * {@inheritdoc}
- */
- public function __construct($url = 'http://localhost:4444/wd/hub')
- {
- parent::__construct($url);
- $locatorStrategy = new \ReflectionClass('WebDriver\LocatorStrategy');
- $this->strategies = $locatorStrategy->getConstants();
- }
- /**
- * Find element: /session/:sessionId/element (POST)
- * Find child element: /session/:sessionId/element/:id/element (POST)
- * Search for element on page, starting from the document root.
- *
- * @param string $using the locator strategy to use
- * @param string $value the search target
- *
- * @return \WebDriver\Element
- *
- * @throws \WebDriver\Exception if element not found, or invalid XPath
- */
- public function element($using = null, $value = null)
- {
- $locatorJson = $this->parseArgs('element', func_get_args());
- try {
- $result = $this->curl(
- 'POST',
- '/element',
- $locatorJson
- );
- } catch (WebDriverException\NoSuchElement $e) {
- throw WebDriverException::factory(
- WebDriverException::NO_SUCH_ELEMENT,
- sprintf(
- "Element not found with %s, %s\n\n%s",
- $locatorJson['using'],
- $locatorJson['value'],
- $e->getMessage()
- ),
- $e
- );
- }
- $element = $this->webDriverElement($result['value']);
- if ($element === null) {
- throw WebDriverException::factory(
- WebDriverException::NO_SUCH_ELEMENT,
- sprintf(
- "Element not found with %s, %s\n",
- $locatorJson['using'],
- $locatorJson['value']
- )
- );
- }
- return $element;
- }
- /**
- * Find elements: /session/:sessionId/elements (POST)
- * Find child elements: /session/:sessionId/element/:id/elements (POST)
- * Search for multiple elements on page, starting from the document root.
- *
- * @param string $using the locator strategy to use
- * @param string $value the search target
- *
- * @return array
- *
- * @throws \WebDriver\Exception if invalid XPath
- */
- public function elements($using = null, $value = null)
- {
- $locatorJson = $this->parseArgs('elements', func_get_args());
- $result = $this->curl(
- 'POST',
- '/elements',
- $locatorJson
- );
- if (!is_array($result['value'])) {
- return array();
- }
- return array_filter(
- array_map(
- array($this, 'webDriverElement'),
- $result['value']
- )
- );
- }
- /**
- * Parse arguments allowing either separate $using and $value parameters, or
- * as an array containing the JSON parameters
- *
- * @param string $method method name
- * @param array $argv arguments
- *
- * @return array
- *
- * @throws \WebDriver\Exception if invalid number of arguments to the called method
- */
- private function parseArgs($method, $argv)
- {
- $argc = count($argv);
- switch ($argc) {
- case 2:
- $using = $argv[0];
- $value = $argv[1];
- break;
- case 1:
- $arg = $argv[0];
- if (is_array($arg)) {
- $using = $arg['using'];
- $value = $arg['value'];
- break;
- }
- // fall through
- default:
- throw WebDriverException::factory(
- WebDriverException::JSON_PARAMETERS_EXPECTED,
- sprintf('Invalid arguments to %s method: %s', $method, print_r($argv, true))
- );
- }
- return $this->locate($using, $value);
- }
- /**
- * Return JSON parameter for element / elements command
- *
- * @param string $using locator strategy
- * @param string $value search target
- *
- * @return array
- *
- * @throws \WebDriver\Exception if invalid locator strategy
- */
- public function locate($using, $value)
- {
- if (!in_array($using, $this->strategies)) {
- throw WebDriverException::factory(
- WebDriverException::UNKNOWN_LOCATOR_STRATEGY,
- sprintf('Invalid locator strategy %s', $using)
- );
- }
- return array(
- 'using' => $using,
- 'value' => $value,
- );
- }
- /**
- * Return WebDriver\Element wrapper for $value
- *
- * @param mixed $value
- *
- * @return \WebDriver\Element|null
- */
- protected function webDriverElement($value)
- {
- return array_key_exists('ELEMENT', (array) $value)
- ? new Element(
- $this->getElementPath($value['ELEMENT']), // url
- $value['ELEMENT'] // id
- )
- : null;
- }
- /**
- * {@inheritdoc}
- */
- public function __call($name, $arguments)
- {
- if (count($arguments) === 1 && in_array(str_replace('_', ' ', $name), $this->strategies)) {
- return $this->locate($name, $arguments[0]);
- }
- // fallback to executing WebDriver commands
- return parent::__call($name, $arguments);
- }
- /**
- * Get wire protocol URL for an element
- *
- * @param string $elementId
- *
- * @return string
- */
- abstract protected function getElementPath($elementId);
- }
|