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