xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/Support/Events/EventFiringWebDriver.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace Facebook\WebDriver\Support\Events;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Facebook\WebDriver\Exception\UnsupportedOperationException;
6*04fd306cSNickeauuse Facebook\WebDriver\Exception\WebDriverException;
7*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Touch\WebDriverTouchScreen;
8*04fd306cSNickeauuse Facebook\WebDriver\JavaScriptExecutor;
9*04fd306cSNickeauuse Facebook\WebDriver\WebDriver;
10*04fd306cSNickeauuse Facebook\WebDriver\WebDriverBy;
11*04fd306cSNickeauuse Facebook\WebDriver\WebDriverDispatcher;
12*04fd306cSNickeauuse Facebook\WebDriver\WebDriverElement;
13*04fd306cSNickeauuse Facebook\WebDriver\WebDriverOptions;
14*04fd306cSNickeauuse Facebook\WebDriver\WebDriverTargetLocator;
15*04fd306cSNickeauuse Facebook\WebDriver\WebDriverWait;
16*04fd306cSNickeau
17*04fd306cSNickeauclass EventFiringWebDriver implements WebDriver, JavaScriptExecutor
18*04fd306cSNickeau{
19*04fd306cSNickeau    /**
20*04fd306cSNickeau     * @var WebDriver
21*04fd306cSNickeau     */
22*04fd306cSNickeau    protected $driver;
23*04fd306cSNickeau
24*04fd306cSNickeau    /**
25*04fd306cSNickeau     * @var WebDriverDispatcher
26*04fd306cSNickeau     */
27*04fd306cSNickeau    protected $dispatcher;
28*04fd306cSNickeau
29*04fd306cSNickeau    /**
30*04fd306cSNickeau     * @param WebDriver $driver
31*04fd306cSNickeau     * @param WebDriverDispatcher $dispatcher
32*04fd306cSNickeau     */
33*04fd306cSNickeau    public function __construct(WebDriver $driver, WebDriverDispatcher $dispatcher = null)
34*04fd306cSNickeau    {
35*04fd306cSNickeau        $this->dispatcher = $dispatcher ?: new WebDriverDispatcher();
36*04fd306cSNickeau        if (!$this->dispatcher->getDefaultDriver()) {
37*04fd306cSNickeau            $this->dispatcher->setDefaultDriver($this);
38*04fd306cSNickeau        }
39*04fd306cSNickeau        $this->driver = $driver;
40*04fd306cSNickeau    }
41*04fd306cSNickeau
42*04fd306cSNickeau    /**
43*04fd306cSNickeau     * @return WebDriverDispatcher
44*04fd306cSNickeau     */
45*04fd306cSNickeau    public function getDispatcher()
46*04fd306cSNickeau    {
47*04fd306cSNickeau        return $this->dispatcher;
48*04fd306cSNickeau    }
49*04fd306cSNickeau
50*04fd306cSNickeau    /**
51*04fd306cSNickeau     * @return WebDriver
52*04fd306cSNickeau     */
53*04fd306cSNickeau    public function getWebDriver()
54*04fd306cSNickeau    {
55*04fd306cSNickeau        return $this->driver;
56*04fd306cSNickeau    }
57*04fd306cSNickeau
58*04fd306cSNickeau    /**
59*04fd306cSNickeau     * @param mixed $url
60*04fd306cSNickeau     * @throws WebDriverException
61*04fd306cSNickeau     * @return $this
62*04fd306cSNickeau     */
63*04fd306cSNickeau    public function get($url)
64*04fd306cSNickeau    {
65*04fd306cSNickeau        $this->dispatch('beforeNavigateTo', $url, $this);
66*04fd306cSNickeau
67*04fd306cSNickeau        try {
68*04fd306cSNickeau            $this->driver->get($url);
69*04fd306cSNickeau        } catch (WebDriverException $exception) {
70*04fd306cSNickeau            $this->dispatchOnException($exception);
71*04fd306cSNickeau            throw $exception;
72*04fd306cSNickeau        }
73*04fd306cSNickeau        $this->dispatch('afterNavigateTo', $url, $this);
74*04fd306cSNickeau
75*04fd306cSNickeau        return $this;
76*04fd306cSNickeau    }
77*04fd306cSNickeau
78*04fd306cSNickeau    /**
79*04fd306cSNickeau     * @param WebDriverBy $by
80*04fd306cSNickeau     * @throws WebDriverException
81*04fd306cSNickeau     * @return array
82*04fd306cSNickeau     */
83*04fd306cSNickeau    public function findElements(WebDriverBy $by)
84*04fd306cSNickeau    {
85*04fd306cSNickeau        $this->dispatch('beforeFindBy', $by, null, $this);
86*04fd306cSNickeau        $elements = [];
87*04fd306cSNickeau
88*04fd306cSNickeau        try {
89*04fd306cSNickeau            foreach ($this->driver->findElements($by) as $element) {
90*04fd306cSNickeau                $elements[] = $this->newElement($element);
91*04fd306cSNickeau            }
92*04fd306cSNickeau        } catch (WebDriverException $exception) {
93*04fd306cSNickeau            $this->dispatchOnException($exception);
94*04fd306cSNickeau            throw $exception;
95*04fd306cSNickeau        }
96*04fd306cSNickeau
97*04fd306cSNickeau        $this->dispatch('afterFindBy', $by, null, $this);
98*04fd306cSNickeau
99*04fd306cSNickeau        return $elements;
100*04fd306cSNickeau    }
101*04fd306cSNickeau
102*04fd306cSNickeau    /**
103*04fd306cSNickeau     * @param WebDriverBy $by
104*04fd306cSNickeau     * @throws WebDriverException
105*04fd306cSNickeau     * @return EventFiringWebElement
106*04fd306cSNickeau     */
107*04fd306cSNickeau    public function findElement(WebDriverBy $by)
108*04fd306cSNickeau    {
109*04fd306cSNickeau        $this->dispatch('beforeFindBy', $by, null, $this);
110*04fd306cSNickeau
111*04fd306cSNickeau        try {
112*04fd306cSNickeau            $element = $this->newElement($this->driver->findElement($by));
113*04fd306cSNickeau        } catch (WebDriverException $exception) {
114*04fd306cSNickeau            $this->dispatchOnException($exception);
115*04fd306cSNickeau            throw $exception;
116*04fd306cSNickeau        }
117*04fd306cSNickeau
118*04fd306cSNickeau        $this->dispatch('afterFindBy', $by, null, $this);
119*04fd306cSNickeau
120*04fd306cSNickeau        return $element;
121*04fd306cSNickeau    }
122*04fd306cSNickeau
123*04fd306cSNickeau    /**
124*04fd306cSNickeau     * @param string $script
125*04fd306cSNickeau     * @param array $arguments
126*04fd306cSNickeau     * @throws WebDriverException
127*04fd306cSNickeau     * @return mixed
128*04fd306cSNickeau     */
129*04fd306cSNickeau    public function executeScript($script, array $arguments = [])
130*04fd306cSNickeau    {
131*04fd306cSNickeau        if (!$this->driver instanceof JavaScriptExecutor) {
132*04fd306cSNickeau            throw new UnsupportedOperationException(
133*04fd306cSNickeau                'driver does not implement JavaScriptExecutor'
134*04fd306cSNickeau            );
135*04fd306cSNickeau        }
136*04fd306cSNickeau
137*04fd306cSNickeau        $this->dispatch('beforeScript', $script, $this);
138*04fd306cSNickeau
139*04fd306cSNickeau        try {
140*04fd306cSNickeau            $result = $this->driver->executeScript($script, $arguments);
141*04fd306cSNickeau        } catch (WebDriverException $exception) {
142*04fd306cSNickeau            $this->dispatchOnException($exception);
143*04fd306cSNickeau            throw $exception;
144*04fd306cSNickeau        }
145*04fd306cSNickeau
146*04fd306cSNickeau        $this->dispatch('afterScript', $script, $this);
147*04fd306cSNickeau
148*04fd306cSNickeau        return $result;
149*04fd306cSNickeau    }
150*04fd306cSNickeau
151*04fd306cSNickeau    /**
152*04fd306cSNickeau     * @param string $script
153*04fd306cSNickeau     * @param array $arguments
154*04fd306cSNickeau     * @throws WebDriverException
155*04fd306cSNickeau     * @return mixed
156*04fd306cSNickeau     */
157*04fd306cSNickeau    public function executeAsyncScript($script, array $arguments = [])
158*04fd306cSNickeau    {
159*04fd306cSNickeau        if (!$this->driver instanceof JavaScriptExecutor) {
160*04fd306cSNickeau            throw new UnsupportedOperationException(
161*04fd306cSNickeau                'driver does not implement JavaScriptExecutor'
162*04fd306cSNickeau            );
163*04fd306cSNickeau        }
164*04fd306cSNickeau
165*04fd306cSNickeau        $this->dispatch('beforeScript', $script, $this);
166*04fd306cSNickeau
167*04fd306cSNickeau        try {
168*04fd306cSNickeau            $result = $this->driver->executeAsyncScript($script, $arguments);
169*04fd306cSNickeau        } catch (WebDriverException $exception) {
170*04fd306cSNickeau            $this->dispatchOnException($exception);
171*04fd306cSNickeau            throw $exception;
172*04fd306cSNickeau        }
173*04fd306cSNickeau        $this->dispatch('afterScript', $script, $this);
174*04fd306cSNickeau
175*04fd306cSNickeau        return $result;
176*04fd306cSNickeau    }
177*04fd306cSNickeau
178*04fd306cSNickeau    /**
179*04fd306cSNickeau     * @throws WebDriverException
180*04fd306cSNickeau     * @return $this
181*04fd306cSNickeau     */
182*04fd306cSNickeau    public function close()
183*04fd306cSNickeau    {
184*04fd306cSNickeau        try {
185*04fd306cSNickeau            $this->driver->close();
186*04fd306cSNickeau
187*04fd306cSNickeau            return $this;
188*04fd306cSNickeau        } catch (WebDriverException $exception) {
189*04fd306cSNickeau            $this->dispatchOnException($exception);
190*04fd306cSNickeau            throw $exception;
191*04fd306cSNickeau        }
192*04fd306cSNickeau    }
193*04fd306cSNickeau
194*04fd306cSNickeau    /**
195*04fd306cSNickeau     * @throws WebDriverException
196*04fd306cSNickeau     * @return string
197*04fd306cSNickeau     */
198*04fd306cSNickeau    public function getCurrentURL()
199*04fd306cSNickeau    {
200*04fd306cSNickeau        try {
201*04fd306cSNickeau            return $this->driver->getCurrentURL();
202*04fd306cSNickeau        } catch (WebDriverException $exception) {
203*04fd306cSNickeau            $this->dispatchOnException($exception);
204*04fd306cSNickeau            throw $exception;
205*04fd306cSNickeau        }
206*04fd306cSNickeau    }
207*04fd306cSNickeau
208*04fd306cSNickeau    /**
209*04fd306cSNickeau     * @throws WebDriverException
210*04fd306cSNickeau     * @return string
211*04fd306cSNickeau     */
212*04fd306cSNickeau    public function getPageSource()
213*04fd306cSNickeau    {
214*04fd306cSNickeau        try {
215*04fd306cSNickeau            return $this->driver->getPageSource();
216*04fd306cSNickeau        } catch (WebDriverException $exception) {
217*04fd306cSNickeau            $this->dispatchOnException($exception);
218*04fd306cSNickeau            throw $exception;
219*04fd306cSNickeau        }
220*04fd306cSNickeau    }
221*04fd306cSNickeau
222*04fd306cSNickeau    /**
223*04fd306cSNickeau     * @throws WebDriverException
224*04fd306cSNickeau     * @return string
225*04fd306cSNickeau     */
226*04fd306cSNickeau    public function getTitle()
227*04fd306cSNickeau    {
228*04fd306cSNickeau        try {
229*04fd306cSNickeau            return $this->driver->getTitle();
230*04fd306cSNickeau        } catch (WebDriverException $exception) {
231*04fd306cSNickeau            $this->dispatchOnException($exception);
232*04fd306cSNickeau            throw $exception;
233*04fd306cSNickeau        }
234*04fd306cSNickeau    }
235*04fd306cSNickeau
236*04fd306cSNickeau    /**
237*04fd306cSNickeau     * @throws WebDriverException
238*04fd306cSNickeau     * @return string
239*04fd306cSNickeau     */
240*04fd306cSNickeau    public function getWindowHandle()
241*04fd306cSNickeau    {
242*04fd306cSNickeau        try {
243*04fd306cSNickeau            return $this->driver->getWindowHandle();
244*04fd306cSNickeau        } catch (WebDriverException $exception) {
245*04fd306cSNickeau            $this->dispatchOnException($exception);
246*04fd306cSNickeau            throw $exception;
247*04fd306cSNickeau        }
248*04fd306cSNickeau    }
249*04fd306cSNickeau
250*04fd306cSNickeau    /**
251*04fd306cSNickeau     * @throws WebDriverException
252*04fd306cSNickeau     * @return array
253*04fd306cSNickeau     */
254*04fd306cSNickeau    public function getWindowHandles()
255*04fd306cSNickeau    {
256*04fd306cSNickeau        try {
257*04fd306cSNickeau            return $this->driver->getWindowHandles();
258*04fd306cSNickeau        } catch (WebDriverException $exception) {
259*04fd306cSNickeau            $this->dispatchOnException($exception);
260*04fd306cSNickeau            throw $exception;
261*04fd306cSNickeau        }
262*04fd306cSNickeau    }
263*04fd306cSNickeau
264*04fd306cSNickeau    /**
265*04fd306cSNickeau     * @throws WebDriverException
266*04fd306cSNickeau     */
267*04fd306cSNickeau    public function quit()
268*04fd306cSNickeau    {
269*04fd306cSNickeau        try {
270*04fd306cSNickeau            $this->driver->quit();
271*04fd306cSNickeau        } catch (WebDriverException $exception) {
272*04fd306cSNickeau            $this->dispatchOnException($exception);
273*04fd306cSNickeau            throw $exception;
274*04fd306cSNickeau        }
275*04fd306cSNickeau    }
276*04fd306cSNickeau
277*04fd306cSNickeau    /**
278*04fd306cSNickeau     * @param null|string $save_as
279*04fd306cSNickeau     * @throws WebDriverException
280*04fd306cSNickeau     * @return string
281*04fd306cSNickeau     */
282*04fd306cSNickeau    public function takeScreenshot($save_as = null)
283*04fd306cSNickeau    {
284*04fd306cSNickeau        try {
285*04fd306cSNickeau            return $this->driver->takeScreenshot($save_as);
286*04fd306cSNickeau        } catch (WebDriverException $exception) {
287*04fd306cSNickeau            $this->dispatchOnException($exception);
288*04fd306cSNickeau            throw $exception;
289*04fd306cSNickeau        }
290*04fd306cSNickeau    }
291*04fd306cSNickeau
292*04fd306cSNickeau    /**
293*04fd306cSNickeau     * @param int $timeout_in_second
294*04fd306cSNickeau     * @param int $interval_in_millisecond
295*04fd306cSNickeau     * @throws WebDriverException
296*04fd306cSNickeau     * @return WebDriverWait
297*04fd306cSNickeau     */
298*04fd306cSNickeau    public function wait($timeout_in_second = 30, $interval_in_millisecond = 250)
299*04fd306cSNickeau    {
300*04fd306cSNickeau        try {
301*04fd306cSNickeau            return $this->driver->wait($timeout_in_second, $interval_in_millisecond);
302*04fd306cSNickeau        } catch (WebDriverException $exception) {
303*04fd306cSNickeau            $this->dispatchOnException($exception);
304*04fd306cSNickeau            throw $exception;
305*04fd306cSNickeau        }
306*04fd306cSNickeau    }
307*04fd306cSNickeau
308*04fd306cSNickeau    /**
309*04fd306cSNickeau     * @throws WebDriverException
310*04fd306cSNickeau     * @return WebDriverOptions
311*04fd306cSNickeau     */
312*04fd306cSNickeau    public function manage()
313*04fd306cSNickeau    {
314*04fd306cSNickeau        try {
315*04fd306cSNickeau            return $this->driver->manage();
316*04fd306cSNickeau        } catch (WebDriverException $exception) {
317*04fd306cSNickeau            $this->dispatchOnException($exception);
318*04fd306cSNickeau            throw $exception;
319*04fd306cSNickeau        }
320*04fd306cSNickeau    }
321*04fd306cSNickeau
322*04fd306cSNickeau    /**
323*04fd306cSNickeau     * @throws WebDriverException
324*04fd306cSNickeau     * @return EventFiringWebDriverNavigation
325*04fd306cSNickeau     */
326*04fd306cSNickeau    public function navigate()
327*04fd306cSNickeau    {
328*04fd306cSNickeau        try {
329*04fd306cSNickeau            return new EventFiringWebDriverNavigation(
330*04fd306cSNickeau                $this->driver->navigate(),
331*04fd306cSNickeau                $this->getDispatcher()
332*04fd306cSNickeau            );
333*04fd306cSNickeau        } catch (WebDriverException $exception) {
334*04fd306cSNickeau            $this->dispatchOnException($exception);
335*04fd306cSNickeau            throw $exception;
336*04fd306cSNickeau        }
337*04fd306cSNickeau    }
338*04fd306cSNickeau
339*04fd306cSNickeau    /**
340*04fd306cSNickeau     * @throws WebDriverException
341*04fd306cSNickeau     * @return WebDriverTargetLocator
342*04fd306cSNickeau     */
343*04fd306cSNickeau    public function switchTo()
344*04fd306cSNickeau    {
345*04fd306cSNickeau        try {
346*04fd306cSNickeau            return $this->driver->switchTo();
347*04fd306cSNickeau        } catch (WebDriverException $exception) {
348*04fd306cSNickeau            $this->dispatchOnException($exception);
349*04fd306cSNickeau            throw $exception;
350*04fd306cSNickeau        }
351*04fd306cSNickeau    }
352*04fd306cSNickeau
353*04fd306cSNickeau    /**
354*04fd306cSNickeau     * @throws WebDriverException
355*04fd306cSNickeau     * @return WebDriverTouchScreen
356*04fd306cSNickeau     */
357*04fd306cSNickeau    public function getTouch()
358*04fd306cSNickeau    {
359*04fd306cSNickeau        try {
360*04fd306cSNickeau            return $this->driver->getTouch();
361*04fd306cSNickeau        } catch (WebDriverException $exception) {
362*04fd306cSNickeau            $this->dispatchOnException($exception);
363*04fd306cSNickeau            throw $exception;
364*04fd306cSNickeau        }
365*04fd306cSNickeau    }
366*04fd306cSNickeau
367*04fd306cSNickeau    public function execute($name, $params)
368*04fd306cSNickeau    {
369*04fd306cSNickeau        try {
370*04fd306cSNickeau            return $this->driver->execute($name, $params);
371*04fd306cSNickeau        } catch (WebDriverException $exception) {
372*04fd306cSNickeau            $this->dispatchOnException($exception);
373*04fd306cSNickeau            throw $exception;
374*04fd306cSNickeau        }
375*04fd306cSNickeau    }
376*04fd306cSNickeau
377*04fd306cSNickeau    /**
378*04fd306cSNickeau     * @param WebDriverElement $element
379*04fd306cSNickeau     * @return EventFiringWebElement
380*04fd306cSNickeau     */
381*04fd306cSNickeau    protected function newElement(WebDriverElement $element)
382*04fd306cSNickeau    {
383*04fd306cSNickeau        return new EventFiringWebElement($element, $this->getDispatcher());
384*04fd306cSNickeau    }
385*04fd306cSNickeau
386*04fd306cSNickeau    /**
387*04fd306cSNickeau     * @param mixed $method
388*04fd306cSNickeau     * @param mixed ...$arguments
389*04fd306cSNickeau     */
390*04fd306cSNickeau    protected function dispatch($method, ...$arguments)
391*04fd306cSNickeau    {
392*04fd306cSNickeau        if (!$this->dispatcher) {
393*04fd306cSNickeau            return;
394*04fd306cSNickeau        }
395*04fd306cSNickeau
396*04fd306cSNickeau        $this->dispatcher->dispatch($method, $arguments);
397*04fd306cSNickeau    }
398*04fd306cSNickeau
399*04fd306cSNickeau    /**
400*04fd306cSNickeau     * @param WebDriverException $exception
401*04fd306cSNickeau     */
402*04fd306cSNickeau    protected function dispatchOnException(WebDriverException $exception)
403*04fd306cSNickeau    {
404*04fd306cSNickeau        $this->dispatch('onException', $exception, $this);
405*04fd306cSNickeau    }
406*04fd306cSNickeau}
407