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