1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver\Chrome; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Facebook\WebDriver\Remote\DesiredCapabilities; 6*04fd306cSNickeauuse JsonSerializable; 7*04fd306cSNickeauuse ReturnTypeWillChange; 8*04fd306cSNickeau 9*04fd306cSNickeau/** 10*04fd306cSNickeau * The class manages the capabilities in ChromeDriver. 11*04fd306cSNickeau * 12*04fd306cSNickeau * @see https://sites.google.com/a/chromium.org/chromedriver/capabilities 13*04fd306cSNickeau */ 14*04fd306cSNickeauclass ChromeOptions implements JsonSerializable 15*04fd306cSNickeau{ 16*04fd306cSNickeau /** 17*04fd306cSNickeau * The key of chromeOptions in desired capabilities (in legacy OSS JsonWire protocol) 18*04fd306cSNickeau * @todo Replace value with 'goog:chromeOptions' after JsonWire protocol support is removed 19*04fd306cSNickeau */ 20*04fd306cSNickeau const CAPABILITY = 'chromeOptions'; 21*04fd306cSNickeau /** 22*04fd306cSNickeau * The key of chromeOptions in desired capabilities (in W3C compatible protocol) 23*04fd306cSNickeau */ 24*04fd306cSNickeau const CAPABILITY_W3C = 'goog:chromeOptions'; 25*04fd306cSNickeau /** 26*04fd306cSNickeau * @var array 27*04fd306cSNickeau */ 28*04fd306cSNickeau private $arguments = []; 29*04fd306cSNickeau /** 30*04fd306cSNickeau * @var string 31*04fd306cSNickeau */ 32*04fd306cSNickeau private $binary = ''; 33*04fd306cSNickeau /** 34*04fd306cSNickeau * @var array 35*04fd306cSNickeau */ 36*04fd306cSNickeau private $extensions = []; 37*04fd306cSNickeau /** 38*04fd306cSNickeau * @var array 39*04fd306cSNickeau */ 40*04fd306cSNickeau private $experimentalOptions = []; 41*04fd306cSNickeau 42*04fd306cSNickeau /** 43*04fd306cSNickeau * Return a version of the class which can JSON serialized. 44*04fd306cSNickeau * 45*04fd306cSNickeau * @return array 46*04fd306cSNickeau */ 47*04fd306cSNickeau #[ReturnTypeWillChange] 48*04fd306cSNickeau public function jsonSerialize() 49*04fd306cSNickeau { 50*04fd306cSNickeau return $this->toArray(); 51*04fd306cSNickeau } 52*04fd306cSNickeau 53*04fd306cSNickeau /** 54*04fd306cSNickeau * Sets the path of the Chrome executable. The path should be either absolute 55*04fd306cSNickeau * or relative to the location running ChromeDriver server. 56*04fd306cSNickeau * 57*04fd306cSNickeau * @param string $path 58*04fd306cSNickeau * @return ChromeOptions 59*04fd306cSNickeau */ 60*04fd306cSNickeau public function setBinary($path) 61*04fd306cSNickeau { 62*04fd306cSNickeau $this->binary = $path; 63*04fd306cSNickeau 64*04fd306cSNickeau return $this; 65*04fd306cSNickeau } 66*04fd306cSNickeau 67*04fd306cSNickeau /** 68*04fd306cSNickeau * @param array $arguments 69*04fd306cSNickeau * @return ChromeOptions 70*04fd306cSNickeau */ 71*04fd306cSNickeau public function addArguments(array $arguments) 72*04fd306cSNickeau { 73*04fd306cSNickeau $this->arguments = array_merge($this->arguments, $arguments); 74*04fd306cSNickeau 75*04fd306cSNickeau return $this; 76*04fd306cSNickeau } 77*04fd306cSNickeau 78*04fd306cSNickeau /** 79*04fd306cSNickeau * Add a Chrome extension to install on browser startup. Each path should be 80*04fd306cSNickeau * a packed Chrome extension. 81*04fd306cSNickeau * 82*04fd306cSNickeau * @param array $paths 83*04fd306cSNickeau * @return ChromeOptions 84*04fd306cSNickeau */ 85*04fd306cSNickeau public function addExtensions(array $paths) 86*04fd306cSNickeau { 87*04fd306cSNickeau foreach ($paths as $path) { 88*04fd306cSNickeau $this->addExtension($path); 89*04fd306cSNickeau } 90*04fd306cSNickeau 91*04fd306cSNickeau return $this; 92*04fd306cSNickeau } 93*04fd306cSNickeau 94*04fd306cSNickeau /** 95*04fd306cSNickeau * @param array $encoded_extensions An array of base64 encoded of the extensions. 96*04fd306cSNickeau * @return ChromeOptions 97*04fd306cSNickeau */ 98*04fd306cSNickeau public function addEncodedExtensions(array $encoded_extensions) 99*04fd306cSNickeau { 100*04fd306cSNickeau foreach ($encoded_extensions as $encoded_extension) { 101*04fd306cSNickeau $this->addEncodedExtension($encoded_extension); 102*04fd306cSNickeau } 103*04fd306cSNickeau 104*04fd306cSNickeau return $this; 105*04fd306cSNickeau } 106*04fd306cSNickeau 107*04fd306cSNickeau /** 108*04fd306cSNickeau * Sets an experimental option which has not exposed officially. 109*04fd306cSNickeau * 110*04fd306cSNickeau * @param string $name 111*04fd306cSNickeau * @param mixed $value 112*04fd306cSNickeau * @return ChromeOptions 113*04fd306cSNickeau */ 114*04fd306cSNickeau public function setExperimentalOption($name, $value) 115*04fd306cSNickeau { 116*04fd306cSNickeau $this->experimentalOptions[$name] = $value; 117*04fd306cSNickeau 118*04fd306cSNickeau return $this; 119*04fd306cSNickeau } 120*04fd306cSNickeau 121*04fd306cSNickeau /** 122*04fd306cSNickeau * @return DesiredCapabilities The DesiredCapabilities for Chrome with this options. 123*04fd306cSNickeau */ 124*04fd306cSNickeau public function toCapabilities() 125*04fd306cSNickeau { 126*04fd306cSNickeau $capabilities = DesiredCapabilities::chrome(); 127*04fd306cSNickeau $capabilities->setCapability(self::CAPABILITY, $this); 128*04fd306cSNickeau 129*04fd306cSNickeau return $capabilities; 130*04fd306cSNickeau } 131*04fd306cSNickeau 132*04fd306cSNickeau /** 133*04fd306cSNickeau * @return \ArrayObject|array 134*04fd306cSNickeau */ 135*04fd306cSNickeau public function toArray() 136*04fd306cSNickeau { 137*04fd306cSNickeau // The selenium server expects a 'dictionary' instead of a 'list' when 138*04fd306cSNickeau // reading the chrome option. However, an empty array in PHP will be 139*04fd306cSNickeau // converted to a 'list' instead of a 'dictionary'. To fix it, we work 140*04fd306cSNickeau // with `ArrayObject` 141*04fd306cSNickeau $options = new \ArrayObject($this->experimentalOptions); 142*04fd306cSNickeau 143*04fd306cSNickeau if (!empty($this->binary)) { 144*04fd306cSNickeau $options['binary'] = $this->binary; 145*04fd306cSNickeau } 146*04fd306cSNickeau 147*04fd306cSNickeau if (!empty($this->arguments)) { 148*04fd306cSNickeau $options['args'] = $this->arguments; 149*04fd306cSNickeau } 150*04fd306cSNickeau 151*04fd306cSNickeau if (!empty($this->extensions)) { 152*04fd306cSNickeau $options['extensions'] = $this->extensions; 153*04fd306cSNickeau } 154*04fd306cSNickeau 155*04fd306cSNickeau return $options; 156*04fd306cSNickeau } 157*04fd306cSNickeau 158*04fd306cSNickeau /** 159*04fd306cSNickeau * Add a Chrome extension to install on browser startup. Each path should be a 160*04fd306cSNickeau * packed Chrome extension. 161*04fd306cSNickeau * 162*04fd306cSNickeau * @param string $path 163*04fd306cSNickeau * @return ChromeOptions 164*04fd306cSNickeau */ 165*04fd306cSNickeau private function addExtension($path) 166*04fd306cSNickeau { 167*04fd306cSNickeau $this->addEncodedExtension(base64_encode(file_get_contents($path))); 168*04fd306cSNickeau 169*04fd306cSNickeau return $this; 170*04fd306cSNickeau } 171*04fd306cSNickeau 172*04fd306cSNickeau /** 173*04fd306cSNickeau * @param string $encoded_extension Base64 encoded of the extension. 174*04fd306cSNickeau * @return ChromeOptions 175*04fd306cSNickeau */ 176*04fd306cSNickeau private function addEncodedExtension($encoded_extension) 177*04fd306cSNickeau { 178*04fd306cSNickeau $this->extensions[] = $encoded_extension; 179*04fd306cSNickeau 180*04fd306cSNickeau return $this; 181*04fd306cSNickeau } 182*04fd306cSNickeau} 183