441 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			441 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Facebook\WebDriver\Remote;
 | |
| 
 | |
| use Exception;
 | |
| use Facebook\WebDriver\Chrome\ChromeOptions;
 | |
| use Facebook\WebDriver\Firefox\FirefoxDriver;
 | |
| use Facebook\WebDriver\Firefox\FirefoxOptions;
 | |
| use Facebook\WebDriver\Firefox\FirefoxProfile;
 | |
| use Facebook\WebDriver\WebDriverCapabilities;
 | |
| use Facebook\WebDriver\WebDriverPlatform;
 | |
| 
 | |
| class DesiredCapabilities implements WebDriverCapabilities
 | |
| {
 | |
|     /** @var array */
 | |
|     private $capabilities;
 | |
| 
 | |
|     /** @var array */
 | |
|     private static $ossToW3c = [
 | |
|         WebDriverCapabilityType::PLATFORM => 'platformName',
 | |
|         WebDriverCapabilityType::VERSION => 'browserVersion',
 | |
|         WebDriverCapabilityType::ACCEPT_SSL_CERTS => 'acceptInsecureCerts',
 | |
|         ChromeOptions::CAPABILITY => ChromeOptions::CAPABILITY_W3C,
 | |
|     ];
 | |
| 
 | |
|     public function __construct(array $capabilities = [])
 | |
|     {
 | |
|         $this->capabilities = $capabilities;
 | |
|     }
 | |
| 
 | |
|     public static function createFromW3cCapabilities(array $capabilities = [])
 | |
|     {
 | |
|         $w3cToOss = array_flip(self::$ossToW3c);
 | |
| 
 | |
|         foreach ($w3cToOss as $w3cCapability => $ossCapability) {
 | |
|             // Copy W3C capabilities to OSS ones
 | |
|             if (array_key_exists($w3cCapability, $capabilities)) {
 | |
|                 $capabilities[$ossCapability] = $capabilities[$w3cCapability];
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return new self($capabilities);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return string The name of the browser.
 | |
|      */
 | |
|     public function getBrowserName()
 | |
|     {
 | |
|         return $this->get(WebDriverCapabilityType::BROWSER_NAME, '');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $browser_name
 | |
|      * @return DesiredCapabilities
 | |
|      */
 | |
|     public function setBrowserName($browser_name)
 | |
|     {
 | |
|         $this->set(WebDriverCapabilityType::BROWSER_NAME, $browser_name);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return string The version of the browser.
 | |
|      */
 | |
|     public function getVersion()
 | |
|     {
 | |
|         return $this->get(WebDriverCapabilityType::VERSION, '');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $version
 | |
|      * @return DesiredCapabilities
 | |
|      */
 | |
|     public function setVersion($version)
 | |
|     {
 | |
|         $this->set(WebDriverCapabilityType::VERSION, $version);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $name
 | |
|      * @return mixed The value of a capability.
 | |
|      */
 | |
|     public function getCapability($name)
 | |
|     {
 | |
|         return $this->get($name);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $name
 | |
|      * @param mixed $value
 | |
|      * @return DesiredCapabilities
 | |
|      */
 | |
|     public function setCapability($name, $value)
 | |
|     {
 | |
|         // When setting 'moz:firefoxOptions' from an array and not from instance of FirefoxOptions, we must merge
 | |
|         // it with default FirefoxOptions to keep previous behavior (where the default preferences were added
 | |
|         // using FirefoxProfile, thus not overwritten by adding 'moz:firefoxOptions')
 | |
|         // TODO: remove in next major version, once FirefoxOptions are only accepted as object instance and not as array
 | |
|         if ($name === FirefoxOptions::CAPABILITY && is_array($value)) {
 | |
|             $defaultOptions = (new FirefoxOptions())->toArray();
 | |
|             $value = array_merge($defaultOptions, $value);
 | |
|         }
 | |
| 
 | |
|         $this->set($name, $value);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return string The name of the platform.
 | |
|      */
 | |
|     public function getPlatform()
 | |
|     {
 | |
|         return $this->get(WebDriverCapabilityType::PLATFORM, '');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $platform
 | |
|      * @return DesiredCapabilities
 | |
|      */
 | |
|     public function setPlatform($platform)
 | |
|     {
 | |
|         $this->set(WebDriverCapabilityType::PLATFORM, $platform);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $capability_name
 | |
|      * @return bool Whether the value is not null and not false.
 | |
|      */
 | |
|     public function is($capability_name)
 | |
|     {
 | |
|         return (bool) $this->get($capability_name);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @todo Remove in next major release (BC)
 | |
|      * @deprecated All browsers are always JS enabled except HtmlUnit and it's not meaningful to disable JS execution.
 | |
|      * @return bool Whether javascript is enabled.
 | |
|      */
 | |
|     public function isJavascriptEnabled()
 | |
|     {
 | |
|         return $this->get(WebDriverCapabilityType::JAVASCRIPT_ENABLED, false);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This is a htmlUnit-only option.
 | |
|      *
 | |
|      * @param bool $enabled
 | |
|      * @throws Exception
 | |
|      * @return DesiredCapabilities
 | |
|      * @see https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities#read-write-capabilities
 | |
|      */
 | |
|     public function setJavascriptEnabled($enabled)
 | |
|     {
 | |
|         $browser = $this->getBrowserName();
 | |
|         if ($browser && $browser !== WebDriverBrowserType::HTMLUNIT) {
 | |
|             throw new Exception(
 | |
|                 'isJavascriptEnabled() is a htmlunit-only option. ' .
 | |
|                 'See https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities#read-write-capabilities.'
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         $this->set(WebDriverCapabilityType::JAVASCRIPT_ENABLED, $enabled);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @todo Remove side-effects - not change eg. ChromeOptions::CAPABILITY from instance of ChromeOptions to an array
 | |
|      * @return array
 | |
|      */
 | |
|     public function toArray()
 | |
|     {
 | |
|         if (isset($this->capabilities[ChromeOptions::CAPABILITY]) &&
 | |
|             $this->capabilities[ChromeOptions::CAPABILITY] instanceof ChromeOptions
 | |
|         ) {
 | |
|             $this->capabilities[ChromeOptions::CAPABILITY] =
 | |
|                 $this->capabilities[ChromeOptions::CAPABILITY]->toArray();
 | |
|         }
 | |
| 
 | |
|         if (isset($this->capabilities[FirefoxOptions::CAPABILITY]) &&
 | |
|             $this->capabilities[FirefoxOptions::CAPABILITY] instanceof FirefoxOptions
 | |
|         ) {
 | |
|             $this->capabilities[FirefoxOptions::CAPABILITY] =
 | |
|                 $this->capabilities[FirefoxOptions::CAPABILITY]->toArray();
 | |
|         }
 | |
| 
 | |
|         if (isset($this->capabilities[FirefoxDriver::PROFILE]) &&
 | |
|             $this->capabilities[FirefoxDriver::PROFILE] instanceof FirefoxProfile
 | |
|         ) {
 | |
|             $this->capabilities[FirefoxDriver::PROFILE] =
 | |
|                 $this->capabilities[FirefoxDriver::PROFILE]->encode();
 | |
|         }
 | |
| 
 | |
|         return $this->capabilities;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return array
 | |
|      */
 | |
|     public function toW3cCompatibleArray()
 | |
|     {
 | |
|         $allowedW3cCapabilities = [
 | |
|             'browserName',
 | |
|             'browserVersion',
 | |
|             'platformName',
 | |
|             'acceptInsecureCerts',
 | |
|             'pageLoadStrategy',
 | |
|             'proxy',
 | |
|             'setWindowRect',
 | |
|             'timeouts',
 | |
|             'strictFileInteractability',
 | |
|             'unhandledPromptBehavior',
 | |
|         ];
 | |
| 
 | |
|         $ossCapabilities = $this->toArray();
 | |
|         $w3cCapabilities = [];
 | |
| 
 | |
|         foreach ($ossCapabilities as $capabilityKey => $capabilityValue) {
 | |
|             // Copy already W3C compatible capabilities
 | |
|             if (in_array($capabilityKey, $allowedW3cCapabilities, true)) {
 | |
|                 $w3cCapabilities[$capabilityKey] = $capabilityValue;
 | |
|             }
 | |
| 
 | |
|             // Convert capabilities with changed name
 | |
|             if (array_key_exists($capabilityKey, self::$ossToW3c)) {
 | |
|                 if ($capabilityKey === WebDriverCapabilityType::PLATFORM) {
 | |
|                     $w3cCapabilities[self::$ossToW3c[$capabilityKey]] = mb_strtolower($capabilityValue);
 | |
| 
 | |
|                     // Remove platformName if it is set to "any"
 | |
|                     if ($w3cCapabilities[self::$ossToW3c[$capabilityKey]] === 'any') {
 | |
|                         unset($w3cCapabilities[self::$ossToW3c[$capabilityKey]]);
 | |
|                     }
 | |
|                 } else {
 | |
|                     $w3cCapabilities[self::$ossToW3c[$capabilityKey]] = $capabilityValue;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Copy vendor extensions
 | |
|             if (mb_strpos($capabilityKey, ':') !== false) {
 | |
|                 $w3cCapabilities[$capabilityKey] = $capabilityValue;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Convert ChromeOptions
 | |
|         if (array_key_exists(ChromeOptions::CAPABILITY, $ossCapabilities)) {
 | |
|             if (array_key_exists(ChromeOptions::CAPABILITY_W3C, $ossCapabilities)) {
 | |
|                 $w3cCapabilities[ChromeOptions::CAPABILITY_W3C] = new \ArrayObject(
 | |
|                     array_merge_recursive(
 | |
|                         (array) $ossCapabilities[ChromeOptions::CAPABILITY],
 | |
|                         (array) $ossCapabilities[ChromeOptions::CAPABILITY_W3C]
 | |
|                     )
 | |
|                 );
 | |
|             } else {
 | |
|                 $w3cCapabilities[ChromeOptions::CAPABILITY_W3C] = $ossCapabilities[ChromeOptions::CAPABILITY];
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Convert Firefox profile
 | |
|         if (array_key_exists(FirefoxDriver::PROFILE, $ossCapabilities)) {
 | |
|             // Convert profile only if not already set in moz:firefoxOptions
 | |
|             if (!array_key_exists(FirefoxOptions::CAPABILITY, $ossCapabilities)
 | |
|                 || !array_key_exists('profile', $ossCapabilities[FirefoxOptions::CAPABILITY])) {
 | |
|                 $w3cCapabilities[FirefoxOptions::CAPABILITY]['profile'] = $ossCapabilities[FirefoxDriver::PROFILE];
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $w3cCapabilities;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function android()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::ANDROID,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANDROID,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function chrome()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::CHROME,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function firefox()
 | |
|     {
 | |
|         $caps = new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::FIREFOX,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY,
 | |
|         ]);
 | |
| 
 | |
|         $caps->setCapability(FirefoxOptions::CAPABILITY, new FirefoxOptions()); // to add default options
 | |
| 
 | |
|         return $caps;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function htmlUnit()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::HTMLUNIT,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function htmlUnitWithJS()
 | |
|     {
 | |
|         $caps = new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::HTMLUNIT,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY,
 | |
|         ]);
 | |
| 
 | |
|         return $caps->setJavascriptEnabled(true);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function internetExplorer()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::IE,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::WINDOWS,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function microsoftEdge()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::MICROSOFT_EDGE,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::WINDOWS,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function iphone()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::IPHONE,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::MAC,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function ipad()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::IPAD,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::MAC,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function opera()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::OPERA,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return static
 | |
|      */
 | |
|     public static function safari()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::SAFARI,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @deprecated PhantomJS is no longer developed and its support will be removed in next major version.
 | |
|      * Use headless Chrome or Firefox instead.
 | |
|      * @return static
 | |
|      */
 | |
|     public static function phantomjs()
 | |
|     {
 | |
|         return new static([
 | |
|             WebDriverCapabilityType::BROWSER_NAME => WebDriverBrowserType::PHANTOMJS,
 | |
|             WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $key
 | |
|      * @param mixed $value
 | |
|      * @return DesiredCapabilities
 | |
|      */
 | |
|     private function set($key, $value)
 | |
|     {
 | |
|         $this->capabilities[$key] = $value;
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $key
 | |
|      * @param mixed $default
 | |
|      * @return mixed
 | |
|      */
 | |
|     private function get($key, $default = null)
 | |
|     {
 | |
|         return isset($this->capabilities[$key])
 | |
|             ? $this->capabilities[$key]
 | |
|             : $default;
 | |
|     }
 | |
| }
 | 
