Mercurial > hg > isophonics-drupal-site
comparison vendor/instaclick/php-webdriver/lib/WebDriver/Container.php @ 14:1fec387a4317
Update Drupal core to 8.5.2 via Composer
author | Chris Cannam |
---|---|
date | Mon, 23 Apr 2018 09:46:53 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
13:5fb285c0d0e3 | 14:1fec387a4317 |
---|---|
1 <?php | |
2 /** | |
3 * Copyright 2004-2017 Facebook. All Rights Reserved. | |
4 * | |
5 * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 * you may not use this file except in compliance with the License. | |
7 * You may obtain a copy of the License at | |
8 * | |
9 * http://www.apache.org/licenses/LICENSE-2.0 | |
10 * | |
11 * Unless required by applicable law or agreed to in writing, software | |
12 * distributed under the License is distributed on an "AS IS" BASIS, | |
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 * See the License for the specific language governing permissions and | |
15 * limitations under the License. | |
16 * | |
17 * @package WebDriver | |
18 * | |
19 * @author Justin Bishop <jubishop@gmail.com> | |
20 * @author Anthon Pang <apang@softwaredevelopment.ca> | |
21 * @author Fabrizio Branca <mail@fabrizio-branca.de> | |
22 */ | |
23 | |
24 namespace WebDriver; | |
25 | |
26 use WebDriver\Exception as WebDriverException; | |
27 | |
28 /** | |
29 * Abstract WebDriver\Container class | |
30 * | |
31 * @package WebDriver | |
32 */ | |
33 abstract class Container extends AbstractWebDriver | |
34 { | |
35 /** | |
36 * {@inheritdoc} | |
37 */ | |
38 public function __construct($url = 'http://localhost:4444/wd/hub') | |
39 { | |
40 parent::__construct($url); | |
41 | |
42 $locatorStrategy = new \ReflectionClass('WebDriver\LocatorStrategy'); | |
43 $this->strategies = $locatorStrategy->getConstants(); | |
44 } | |
45 | |
46 /** | |
47 * Find element: /session/:sessionId/element (POST) | |
48 * Find child element: /session/:sessionId/element/:id/element (POST) | |
49 * Search for element on page, starting from the document root. | |
50 * | |
51 * @param string $using the locator strategy to use | |
52 * @param string $value the search target | |
53 * | |
54 * @return \WebDriver\Element | |
55 * | |
56 * @throws \WebDriver\Exception if element not found, or invalid XPath | |
57 */ | |
58 public function element($using = null, $value = null) | |
59 { | |
60 $locatorJson = $this->parseArgs('element', func_get_args()); | |
61 | |
62 try { | |
63 $result = $this->curl( | |
64 'POST', | |
65 '/element', | |
66 $locatorJson | |
67 ); | |
68 } catch (WebDriverException\NoSuchElement $e) { | |
69 throw WebDriverException::factory( | |
70 WebDriverException::NO_SUCH_ELEMENT, | |
71 sprintf( | |
72 "Element not found with %s, %s\n\n%s", | |
73 $locatorJson['using'], | |
74 $locatorJson['value'], | |
75 $e->getMessage() | |
76 ), | |
77 $e | |
78 ); | |
79 } | |
80 | |
81 $element = $this->webDriverElement($result['value']); | |
82 | |
83 if ($element === null) { | |
84 throw WebDriverException::factory( | |
85 WebDriverException::NO_SUCH_ELEMENT, | |
86 sprintf( | |
87 "Element not found with %s, %s\n", | |
88 $locatorJson['using'], | |
89 $locatorJson['value'] | |
90 ) | |
91 ); | |
92 } | |
93 | |
94 return $element; | |
95 } | |
96 | |
97 /** | |
98 * Find elements: /session/:sessionId/elements (POST) | |
99 * Find child elements: /session/:sessionId/element/:id/elements (POST) | |
100 * Search for multiple elements on page, starting from the document root. | |
101 * | |
102 * @param string $using the locator strategy to use | |
103 * @param string $value the search target | |
104 * | |
105 * @return array | |
106 * | |
107 * @throws \WebDriver\Exception if invalid XPath | |
108 */ | |
109 public function elements($using = null, $value = null) | |
110 { | |
111 $locatorJson = $this->parseArgs('elements', func_get_args()); | |
112 | |
113 $result = $this->curl( | |
114 'POST', | |
115 '/elements', | |
116 $locatorJson | |
117 ); | |
118 | |
119 if (!is_array($result['value'])) { | |
120 return array(); | |
121 } | |
122 | |
123 return array_filter( | |
124 array_map( | |
125 array($this, 'webDriverElement'), | |
126 $result['value'] | |
127 ) | |
128 ); | |
129 } | |
130 | |
131 /** | |
132 * Parse arguments allowing either separate $using and $value parameters, or | |
133 * as an array containing the JSON parameters | |
134 * | |
135 * @param string $method method name | |
136 * @param array $argv arguments | |
137 * | |
138 * @return array | |
139 * | |
140 * @throws \WebDriver\Exception if invalid number of arguments to the called method | |
141 */ | |
142 private function parseArgs($method, $argv) | |
143 { | |
144 $argc = count($argv); | |
145 | |
146 switch ($argc) { | |
147 case 2: | |
148 $using = $argv[0]; | |
149 $value = $argv[1]; | |
150 break; | |
151 | |
152 case 1: | |
153 $arg = $argv[0]; | |
154 | |
155 if (is_array($arg)) { | |
156 $using = $arg['using']; | |
157 $value = $arg['value']; | |
158 break; | |
159 } | |
160 | |
161 // fall through | |
162 default: | |
163 throw WebDriverException::factory( | |
164 WebDriverException::JSON_PARAMETERS_EXPECTED, | |
165 sprintf('Invalid arguments to %s method: %s', $method, print_r($argv, true)) | |
166 ); | |
167 } | |
168 | |
169 return $this->locate($using, $value); | |
170 } | |
171 | |
172 /** | |
173 * Return JSON parameter for element / elements command | |
174 * | |
175 * @param string $using locator strategy | |
176 * @param string $value search target | |
177 * | |
178 * @return array | |
179 * | |
180 * @throws \WebDriver\Exception if invalid locator strategy | |
181 */ | |
182 public function locate($using, $value) | |
183 { | |
184 if (!in_array($using, $this->strategies)) { | |
185 throw WebDriverException::factory( | |
186 WebDriverException::UNKNOWN_LOCATOR_STRATEGY, | |
187 sprintf('Invalid locator strategy %s', $using) | |
188 ); | |
189 } | |
190 | |
191 return array( | |
192 'using' => $using, | |
193 'value' => $value, | |
194 ); | |
195 } | |
196 | |
197 /** | |
198 * Return WebDriver\Element wrapper for $value | |
199 * | |
200 * @param mixed $value | |
201 * | |
202 * @return \WebDriver\Element|null | |
203 */ | |
204 protected function webDriverElement($value) | |
205 { | |
206 return array_key_exists('ELEMENT', (array) $value) | |
207 ? new Element( | |
208 $this->getElementPath($value['ELEMENT']), // url | |
209 $value['ELEMENT'] // id | |
210 ) | |
211 : null; | |
212 } | |
213 | |
214 /** | |
215 * {@inheritdoc} | |
216 */ | |
217 public function __call($name, $arguments) | |
218 { | |
219 if (count($arguments) === 1 && in_array(str_replace('_', ' ', $name), $this->strategies)) { | |
220 return $this->locate($name, $arguments[0]); | |
221 } | |
222 | |
223 // fallback to executing WebDriver commands | |
224 return parent::__call($name, $arguments); | |
225 } | |
226 | |
227 /** | |
228 * Get wire protocol URL for an element | |
229 * | |
230 * @param string $elementId | |
231 * | |
232 * @return string | |
233 */ | |
234 abstract protected function getElementPath($elementId); | |
235 } |