407 lines
10 KiB
PHP
407 lines
10 KiB
PHP
<?php
|
|
|
|
namespace Facebook\WebDriver\Support\Events;
|
|
|
|
use Facebook\WebDriver\Exception\UnsupportedOperationException;
|
|
use Facebook\WebDriver\Exception\WebDriverException;
|
|
use Facebook\WebDriver\Interactions\Touch\WebDriverTouchScreen;
|
|
use Facebook\WebDriver\JavaScriptExecutor;
|
|
use Facebook\WebDriver\WebDriver;
|
|
use Facebook\WebDriver\WebDriverBy;
|
|
use Facebook\WebDriver\WebDriverDispatcher;
|
|
use Facebook\WebDriver\WebDriverElement;
|
|
use Facebook\WebDriver\WebDriverOptions;
|
|
use Facebook\WebDriver\WebDriverTargetLocator;
|
|
use Facebook\WebDriver\WebDriverWait;
|
|
|
|
class EventFiringWebDriver implements WebDriver, JavaScriptExecutor
|
|
{
|
|
/**
|
|
* @var WebDriver
|
|
*/
|
|
protected $driver;
|
|
|
|
/**
|
|
* @var WebDriverDispatcher
|
|
*/
|
|
protected $dispatcher;
|
|
|
|
/**
|
|
* @param WebDriver $driver
|
|
* @param WebDriverDispatcher $dispatcher
|
|
*/
|
|
public function __construct(WebDriver $driver, WebDriverDispatcher $dispatcher = null)
|
|
{
|
|
$this->dispatcher = $dispatcher ?: new WebDriverDispatcher();
|
|
if (!$this->dispatcher->getDefaultDriver()) {
|
|
$this->dispatcher->setDefaultDriver($this);
|
|
}
|
|
$this->driver = $driver;
|
|
}
|
|
|
|
/**
|
|
* @return WebDriverDispatcher
|
|
*/
|
|
public function getDispatcher()
|
|
{
|
|
return $this->dispatcher;
|
|
}
|
|
|
|
/**
|
|
* @return WebDriver
|
|
*/
|
|
public function getWebDriver()
|
|
{
|
|
return $this->driver;
|
|
}
|
|
|
|
/**
|
|
* @param mixed $url
|
|
* @throws WebDriverException
|
|
* @return $this
|
|
*/
|
|
public function get($url)
|
|
{
|
|
$this->dispatch('beforeNavigateTo', $url, $this);
|
|
|
|
try {
|
|
$this->driver->get($url);
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
$this->dispatch('afterNavigateTo', $url, $this);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param WebDriverBy $by
|
|
* @throws WebDriverException
|
|
* @return array
|
|
*/
|
|
public function findElements(WebDriverBy $by)
|
|
{
|
|
$this->dispatch('beforeFindBy', $by, null, $this);
|
|
$elements = [];
|
|
|
|
try {
|
|
foreach ($this->driver->findElements($by) as $element) {
|
|
$elements[] = $this->newElement($element);
|
|
}
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
|
|
$this->dispatch('afterFindBy', $by, null, $this);
|
|
|
|
return $elements;
|
|
}
|
|
|
|
/**
|
|
* @param WebDriverBy $by
|
|
* @throws WebDriverException
|
|
* @return EventFiringWebElement
|
|
*/
|
|
public function findElement(WebDriverBy $by)
|
|
{
|
|
$this->dispatch('beforeFindBy', $by, null, $this);
|
|
|
|
try {
|
|
$element = $this->newElement($this->driver->findElement($by));
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
|
|
$this->dispatch('afterFindBy', $by, null, $this);
|
|
|
|
return $element;
|
|
}
|
|
|
|
/**
|
|
* @param string $script
|
|
* @param array $arguments
|
|
* @throws WebDriverException
|
|
* @return mixed
|
|
*/
|
|
public function executeScript($script, array $arguments = [])
|
|
{
|
|
if (!$this->driver instanceof JavaScriptExecutor) {
|
|
throw new UnsupportedOperationException(
|
|
'driver does not implement JavaScriptExecutor'
|
|
);
|
|
}
|
|
|
|
$this->dispatch('beforeScript', $script, $this);
|
|
|
|
try {
|
|
$result = $this->driver->executeScript($script, $arguments);
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
|
|
$this->dispatch('afterScript', $script, $this);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @param string $script
|
|
* @param array $arguments
|
|
* @throws WebDriverException
|
|
* @return mixed
|
|
*/
|
|
public function executeAsyncScript($script, array $arguments = [])
|
|
{
|
|
if (!$this->driver instanceof JavaScriptExecutor) {
|
|
throw new UnsupportedOperationException(
|
|
'driver does not implement JavaScriptExecutor'
|
|
);
|
|
}
|
|
|
|
$this->dispatch('beforeScript', $script, $this);
|
|
|
|
try {
|
|
$result = $this->driver->executeAsyncScript($script, $arguments);
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
$this->dispatch('afterScript', $script, $this);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return $this
|
|
*/
|
|
public function close()
|
|
{
|
|
try {
|
|
$this->driver->close();
|
|
|
|
return $this;
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return string
|
|
*/
|
|
public function getCurrentURL()
|
|
{
|
|
try {
|
|
return $this->driver->getCurrentURL();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return string
|
|
*/
|
|
public function getPageSource()
|
|
{
|
|
try {
|
|
return $this->driver->getPageSource();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return string
|
|
*/
|
|
public function getTitle()
|
|
{
|
|
try {
|
|
return $this->driver->getTitle();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return string
|
|
*/
|
|
public function getWindowHandle()
|
|
{
|
|
try {
|
|
return $this->driver->getWindowHandle();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return array
|
|
*/
|
|
public function getWindowHandles()
|
|
{
|
|
try {
|
|
return $this->driver->getWindowHandles();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
*/
|
|
public function quit()
|
|
{
|
|
try {
|
|
$this->driver->quit();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param null|string $save_as
|
|
* @throws WebDriverException
|
|
* @return string
|
|
*/
|
|
public function takeScreenshot($save_as = null)
|
|
{
|
|
try {
|
|
return $this->driver->takeScreenshot($save_as);
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int $timeout_in_second
|
|
* @param int $interval_in_millisecond
|
|
* @throws WebDriverException
|
|
* @return WebDriverWait
|
|
*/
|
|
public function wait($timeout_in_second = 30, $interval_in_millisecond = 250)
|
|
{
|
|
try {
|
|
return $this->driver->wait($timeout_in_second, $interval_in_millisecond);
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return WebDriverOptions
|
|
*/
|
|
public function manage()
|
|
{
|
|
try {
|
|
return $this->driver->manage();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return EventFiringWebDriverNavigation
|
|
*/
|
|
public function navigate()
|
|
{
|
|
try {
|
|
return new EventFiringWebDriverNavigation(
|
|
$this->driver->navigate(),
|
|
$this->getDispatcher()
|
|
);
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return WebDriverTargetLocator
|
|
*/
|
|
public function switchTo()
|
|
{
|
|
try {
|
|
return $this->driver->switchTo();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws WebDriverException
|
|
* @return WebDriverTouchScreen
|
|
*/
|
|
public function getTouch()
|
|
{
|
|
try {
|
|
return $this->driver->getTouch();
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
public function execute($name, $params)
|
|
{
|
|
try {
|
|
return $this->driver->execute($name, $params);
|
|
} catch (WebDriverException $exception) {
|
|
$this->dispatchOnException($exception);
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param WebDriverElement $element
|
|
* @return EventFiringWebElement
|
|
*/
|
|
protected function newElement(WebDriverElement $element)
|
|
{
|
|
return new EventFiringWebElement($element, $this->getDispatcher());
|
|
}
|
|
|
|
/**
|
|
* @param mixed $method
|
|
* @param mixed ...$arguments
|
|
*/
|
|
protected function dispatch($method, ...$arguments)
|
|
{
|
|
if (!$this->dispatcher) {
|
|
return;
|
|
}
|
|
|
|
$this->dispatcher->dispatch($method, $arguments);
|
|
}
|
|
|
|
/**
|
|
* @param WebDriverException $exception
|
|
*/
|
|
protected function dispatchOnException(WebDriverException $exception)
|
|
{
|
|
$this->dispatch('onException', $exception, $this);
|
|
}
|
|
}
|