Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Mink package.
|
Chris@0
|
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@0
|
11 namespace Behat\Mink;
|
Chris@0
|
12
|
Chris@0
|
13 use Behat\Mink\Driver\DriverInterface;
|
Chris@0
|
14 use Behat\Mink\Selector\SelectorsHandler;
|
Chris@0
|
15 use Behat\Mink\Element\DocumentElement;
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Mink session.
|
Chris@0
|
19 *
|
Chris@0
|
20 * @author Konstantin Kudryashov <ever.zet@gmail.com>
|
Chris@0
|
21 */
|
Chris@0
|
22 class Session
|
Chris@0
|
23 {
|
Chris@0
|
24 private $driver;
|
Chris@0
|
25 private $page;
|
Chris@0
|
26 private $selectorsHandler;
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * Initializes session.
|
Chris@0
|
30 *
|
Chris@0
|
31 * @param DriverInterface $driver
|
Chris@0
|
32 * @param SelectorsHandler $selectorsHandler
|
Chris@0
|
33 */
|
Chris@0
|
34 public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null)
|
Chris@0
|
35 {
|
Chris@0
|
36 $driver->setSession($this);
|
Chris@0
|
37
|
Chris@0
|
38 if (null === $selectorsHandler) {
|
Chris@0
|
39 $selectorsHandler = new SelectorsHandler();
|
Chris@0
|
40 }
|
Chris@0
|
41
|
Chris@0
|
42 $this->driver = $driver;
|
Chris@0
|
43 $this->selectorsHandler = $selectorsHandler;
|
Chris@0
|
44 $this->page = new DocumentElement($this);
|
Chris@0
|
45 }
|
Chris@0
|
46
|
Chris@0
|
47 /**
|
Chris@0
|
48 * Checks whether session (driver) was started.
|
Chris@0
|
49 *
|
Chris@0
|
50 * @return Boolean
|
Chris@0
|
51 */
|
Chris@0
|
52 public function isStarted()
|
Chris@0
|
53 {
|
Chris@0
|
54 return $this->driver->isStarted();
|
Chris@0
|
55 }
|
Chris@0
|
56
|
Chris@0
|
57 /**
|
Chris@0
|
58 * Starts session driver.
|
Chris@0
|
59 *
|
Chris@0
|
60 * Calling any action before visiting a page is an undefined behavior.
|
Chris@0
|
61 * The only supported method calls on a fresh driver are
|
Chris@0
|
62 * - visit()
|
Chris@0
|
63 * - setRequestHeader()
|
Chris@0
|
64 * - setBasicAuth()
|
Chris@0
|
65 * - reset()
|
Chris@0
|
66 * - stop()
|
Chris@0
|
67 */
|
Chris@0
|
68 public function start()
|
Chris@0
|
69 {
|
Chris@0
|
70 $this->driver->start();
|
Chris@0
|
71 }
|
Chris@0
|
72
|
Chris@0
|
73 /**
|
Chris@0
|
74 * Stops session driver.
|
Chris@0
|
75 */
|
Chris@0
|
76 public function stop()
|
Chris@0
|
77 {
|
Chris@0
|
78 $this->driver->stop();
|
Chris@0
|
79 }
|
Chris@0
|
80
|
Chris@0
|
81 /**
|
Chris@0
|
82 * Restart session driver.
|
Chris@0
|
83 */
|
Chris@0
|
84 public function restart()
|
Chris@0
|
85 {
|
Chris@0
|
86 $this->driver->stop();
|
Chris@0
|
87 $this->driver->start();
|
Chris@0
|
88 }
|
Chris@0
|
89
|
Chris@0
|
90 /**
|
Chris@0
|
91 * Reset session driver state.
|
Chris@0
|
92 *
|
Chris@0
|
93 * Calling any action before visiting a page is an undefined behavior.
|
Chris@0
|
94 * The only supported method calls on a fresh driver are
|
Chris@0
|
95 * - visit()
|
Chris@0
|
96 * - setRequestHeader()
|
Chris@0
|
97 * - setBasicAuth()
|
Chris@0
|
98 * - reset()
|
Chris@0
|
99 * - stop()
|
Chris@0
|
100 */
|
Chris@0
|
101 public function reset()
|
Chris@0
|
102 {
|
Chris@0
|
103 $this->driver->reset();
|
Chris@0
|
104 }
|
Chris@0
|
105
|
Chris@0
|
106 /**
|
Chris@0
|
107 * Returns session driver.
|
Chris@0
|
108 *
|
Chris@0
|
109 * @return DriverInterface
|
Chris@0
|
110 */
|
Chris@0
|
111 public function getDriver()
|
Chris@0
|
112 {
|
Chris@0
|
113 return $this->driver;
|
Chris@0
|
114 }
|
Chris@0
|
115
|
Chris@0
|
116 /**
|
Chris@0
|
117 * Returns page element.
|
Chris@0
|
118 *
|
Chris@0
|
119 * @return DocumentElement
|
Chris@0
|
120 */
|
Chris@0
|
121 public function getPage()
|
Chris@0
|
122 {
|
Chris@0
|
123 return $this->page;
|
Chris@0
|
124 }
|
Chris@0
|
125
|
Chris@0
|
126 /**
|
Chris@0
|
127 * Returns selectors handler.
|
Chris@0
|
128 *
|
Chris@0
|
129 * @return SelectorsHandler
|
Chris@0
|
130 */
|
Chris@0
|
131 public function getSelectorsHandler()
|
Chris@0
|
132 {
|
Chris@0
|
133 return $this->selectorsHandler;
|
Chris@0
|
134 }
|
Chris@0
|
135
|
Chris@0
|
136 /**
|
Chris@0
|
137 * Visit specified URL and automatically start session if not already running.
|
Chris@0
|
138 *
|
Chris@0
|
139 * @param string $url url of the page
|
Chris@0
|
140 */
|
Chris@0
|
141 public function visit($url)
|
Chris@0
|
142 {
|
Chris@0
|
143 // start session if needed
|
Chris@0
|
144 if (!$this->isStarted()) {
|
Chris@0
|
145 $this->start();
|
Chris@0
|
146 }
|
Chris@0
|
147
|
Chris@0
|
148 $this->driver->visit($url);
|
Chris@0
|
149 }
|
Chris@0
|
150
|
Chris@0
|
151 /**
|
Chris@0
|
152 * Sets HTTP Basic authentication parameters.
|
Chris@0
|
153 *
|
Chris@0
|
154 * @param string|Boolean $user user name or false to disable authentication
|
Chris@0
|
155 * @param string $password password
|
Chris@0
|
156 */
|
Chris@0
|
157 public function setBasicAuth($user, $password = '')
|
Chris@0
|
158 {
|
Chris@0
|
159 $this->driver->setBasicAuth($user, $password);
|
Chris@0
|
160 }
|
Chris@0
|
161
|
Chris@0
|
162 /**
|
Chris@0
|
163 * Sets specific request header.
|
Chris@0
|
164 *
|
Chris@0
|
165 * @param string $name
|
Chris@0
|
166 * @param string $value
|
Chris@0
|
167 */
|
Chris@0
|
168 public function setRequestHeader($name, $value)
|
Chris@0
|
169 {
|
Chris@0
|
170 $this->driver->setRequestHeader($name, $value);
|
Chris@0
|
171 }
|
Chris@0
|
172
|
Chris@0
|
173 /**
|
Chris@0
|
174 * Returns all response headers.
|
Chris@0
|
175 *
|
Chris@0
|
176 * @return array
|
Chris@0
|
177 */
|
Chris@0
|
178 public function getResponseHeaders()
|
Chris@0
|
179 {
|
Chris@0
|
180 return $this->driver->getResponseHeaders();
|
Chris@0
|
181 }
|
Chris@0
|
182
|
Chris@0
|
183 /**
|
Chris@0
|
184 * Returns specific response header.
|
Chris@0
|
185 *
|
Chris@0
|
186 * @param string $name
|
Chris@0
|
187 *
|
Chris@0
|
188 * @return string|null
|
Chris@0
|
189 */
|
Chris@0
|
190 public function getResponseHeader($name)
|
Chris@0
|
191 {
|
Chris@0
|
192 $headers = $this->driver->getResponseHeaders();
|
Chris@0
|
193
|
Chris@0
|
194 $name = strtolower($name);
|
Chris@0
|
195 $headers = array_change_key_case($headers, CASE_LOWER);
|
Chris@0
|
196
|
Chris@0
|
197 if (!isset($headers[$name])) {
|
Chris@0
|
198 return null;
|
Chris@0
|
199 }
|
Chris@0
|
200
|
Chris@0
|
201 return is_array($headers[$name]) ? $headers[$name][0] : $headers[$name];
|
Chris@0
|
202 }
|
Chris@0
|
203
|
Chris@0
|
204 /**
|
Chris@0
|
205 * Sets cookie.
|
Chris@0
|
206 *
|
Chris@0
|
207 * @param string $name
|
Chris@0
|
208 * @param string $value
|
Chris@0
|
209 */
|
Chris@0
|
210 public function setCookie($name, $value = null)
|
Chris@0
|
211 {
|
Chris@0
|
212 $this->driver->setCookie($name, $value);
|
Chris@0
|
213 }
|
Chris@0
|
214
|
Chris@0
|
215 /**
|
Chris@0
|
216 * Returns cookie by name.
|
Chris@0
|
217 *
|
Chris@0
|
218 * @param string $name
|
Chris@0
|
219 *
|
Chris@0
|
220 * @return string|null
|
Chris@0
|
221 */
|
Chris@0
|
222 public function getCookie($name)
|
Chris@0
|
223 {
|
Chris@0
|
224 return $this->driver->getCookie($name);
|
Chris@0
|
225 }
|
Chris@0
|
226
|
Chris@0
|
227 /**
|
Chris@0
|
228 * Returns response status code.
|
Chris@0
|
229 *
|
Chris@0
|
230 * @return int
|
Chris@0
|
231 */
|
Chris@0
|
232 public function getStatusCode()
|
Chris@0
|
233 {
|
Chris@0
|
234 return $this->driver->getStatusCode();
|
Chris@0
|
235 }
|
Chris@0
|
236
|
Chris@0
|
237 /**
|
Chris@0
|
238 * Returns current URL address.
|
Chris@0
|
239 *
|
Chris@0
|
240 * @return string
|
Chris@0
|
241 */
|
Chris@0
|
242 public function getCurrentUrl()
|
Chris@0
|
243 {
|
Chris@0
|
244 return $this->driver->getCurrentUrl();
|
Chris@0
|
245 }
|
Chris@0
|
246
|
Chris@0
|
247 /**
|
Chris@0
|
248 * Capture a screenshot of the current window.
|
Chris@0
|
249 *
|
Chris@0
|
250 * @return string screenshot of MIME type image/* depending
|
Chris@0
|
251 * on driver (e.g., image/png, image/jpeg)
|
Chris@0
|
252 */
|
Chris@0
|
253 public function getScreenshot()
|
Chris@0
|
254 {
|
Chris@0
|
255 return $this->driver->getScreenshot();
|
Chris@0
|
256 }
|
Chris@0
|
257
|
Chris@0
|
258 /**
|
Chris@0
|
259 * Return the names of all open windows.
|
Chris@0
|
260 *
|
Chris@0
|
261 * @return array Array of all open window's names.
|
Chris@0
|
262 */
|
Chris@0
|
263 public function getWindowNames()
|
Chris@0
|
264 {
|
Chris@0
|
265 return $this->driver->getWindowNames();
|
Chris@0
|
266 }
|
Chris@0
|
267
|
Chris@0
|
268 /**
|
Chris@0
|
269 * Return the name of the currently active window.
|
Chris@0
|
270 *
|
Chris@0
|
271 * @return string The name of the current window.
|
Chris@0
|
272 */
|
Chris@0
|
273 public function getWindowName()
|
Chris@0
|
274 {
|
Chris@0
|
275 return $this->driver->getWindowName();
|
Chris@0
|
276 }
|
Chris@0
|
277
|
Chris@0
|
278 /**
|
Chris@0
|
279 * Reloads current session page.
|
Chris@0
|
280 */
|
Chris@0
|
281 public function reload()
|
Chris@0
|
282 {
|
Chris@0
|
283 $this->driver->reload();
|
Chris@0
|
284 }
|
Chris@0
|
285
|
Chris@0
|
286 /**
|
Chris@0
|
287 * Moves backward 1 page in history.
|
Chris@0
|
288 */
|
Chris@0
|
289 public function back()
|
Chris@0
|
290 {
|
Chris@0
|
291 $this->driver->back();
|
Chris@0
|
292 }
|
Chris@0
|
293
|
Chris@0
|
294 /**
|
Chris@0
|
295 * Moves forward 1 page in history.
|
Chris@0
|
296 */
|
Chris@0
|
297 public function forward()
|
Chris@0
|
298 {
|
Chris@0
|
299 $this->driver->forward();
|
Chris@0
|
300 }
|
Chris@0
|
301
|
Chris@0
|
302 /**
|
Chris@0
|
303 * Switches to specific browser window.
|
Chris@0
|
304 *
|
Chris@0
|
305 * @param string $name window name (null for switching back to main window)
|
Chris@0
|
306 */
|
Chris@0
|
307 public function switchToWindow($name = null)
|
Chris@0
|
308 {
|
Chris@0
|
309 $this->driver->switchToWindow($name);
|
Chris@0
|
310 }
|
Chris@0
|
311
|
Chris@0
|
312 /**
|
Chris@0
|
313 * Switches to specific iFrame.
|
Chris@0
|
314 *
|
Chris@0
|
315 * @param string $name iframe name (null for switching back)
|
Chris@0
|
316 */
|
Chris@0
|
317 public function switchToIFrame($name = null)
|
Chris@0
|
318 {
|
Chris@0
|
319 $this->driver->switchToIFrame($name);
|
Chris@0
|
320 }
|
Chris@0
|
321
|
Chris@0
|
322 /**
|
Chris@0
|
323 * Execute JS in browser.
|
Chris@0
|
324 *
|
Chris@0
|
325 * @param string $script javascript
|
Chris@0
|
326 */
|
Chris@0
|
327 public function executeScript($script)
|
Chris@0
|
328 {
|
Chris@0
|
329 $this->driver->executeScript($script);
|
Chris@0
|
330 }
|
Chris@0
|
331
|
Chris@0
|
332 /**
|
Chris@0
|
333 * Execute JS in browser and return it's response.
|
Chris@0
|
334 *
|
Chris@0
|
335 * @param string $script javascript
|
Chris@0
|
336 *
|
Chris@0
|
337 * @return string
|
Chris@0
|
338 */
|
Chris@0
|
339 public function evaluateScript($script)
|
Chris@0
|
340 {
|
Chris@0
|
341 return $this->driver->evaluateScript($script);
|
Chris@0
|
342 }
|
Chris@0
|
343
|
Chris@0
|
344 /**
|
Chris@0
|
345 * Waits some time or until JS condition turns true.
|
Chris@0
|
346 *
|
Chris@0
|
347 * @param int $time time in milliseconds
|
Chris@0
|
348 * @param string $condition JS condition
|
Chris@0
|
349 *
|
Chris@0
|
350 * @return bool
|
Chris@0
|
351 */
|
Chris@0
|
352 public function wait($time, $condition = 'false')
|
Chris@0
|
353 {
|
Chris@0
|
354 return $this->driver->wait($time, $condition);
|
Chris@0
|
355 }
|
Chris@0
|
356
|
Chris@0
|
357 /**
|
Chris@0
|
358 * Set the dimensions of the window.
|
Chris@0
|
359 *
|
Chris@0
|
360 * @param int $width set the window width, measured in pixels
|
Chris@0
|
361 * @param int $height set the window height, measured in pixels
|
Chris@0
|
362 * @param string $name window name (null for the main window)
|
Chris@0
|
363 */
|
Chris@0
|
364 public function resizeWindow($width, $height, $name = null)
|
Chris@0
|
365 {
|
Chris@0
|
366 $this->driver->resizeWindow($width, $height, $name);
|
Chris@0
|
367 }
|
Chris@0
|
368
|
Chris@0
|
369 /**
|
Chris@0
|
370 * Maximize the window if it is not maximized already.
|
Chris@0
|
371 *
|
Chris@0
|
372 * @param string $name window name (null for the main window)
|
Chris@0
|
373 */
|
Chris@0
|
374 public function maximizeWindow($name = null)
|
Chris@0
|
375 {
|
Chris@0
|
376 $this->driver->maximizeWindow($name);
|
Chris@0
|
377 }
|
Chris@0
|
378 }
|