1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver\Chrome; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Facebook\WebDriver\Local\LocalWebDriver; 6*04fd306cSNickeauuse Facebook\WebDriver\Remote\DesiredCapabilities; 7*04fd306cSNickeauuse Facebook\WebDriver\Remote\Service\DriverCommandExecutor; 8*04fd306cSNickeauuse Facebook\WebDriver\Remote\WebDriverCommand; 9*04fd306cSNickeau 10*04fd306cSNickeauclass ChromeDriver extends LocalWebDriver 11*04fd306cSNickeau{ 12*04fd306cSNickeau /** @var ChromeDevToolsDriver */ 13*04fd306cSNickeau private $devTools; 14*04fd306cSNickeau 15*04fd306cSNickeau /** 16*04fd306cSNickeau * Creates a new ChromeDriver using default configuration. 17*04fd306cSNickeau * This includes starting a new chromedriver process each time this method is called. However this may be 18*04fd306cSNickeau * unnecessary overhead - instead, you can start the process once using ChromeDriverService and pass 19*04fd306cSNickeau * this instance to startUsingDriverService() method. 20*04fd306cSNickeau * 21*04fd306cSNickeau * @todo Remove $service parameter. Use `ChromeDriver::startUsingDriverService` to pass custom $service instance. 22*04fd306cSNickeau * @return static 23*04fd306cSNickeau */ 24*04fd306cSNickeau public static function start(DesiredCapabilities $desired_capabilities = null, ChromeDriverService $service = null) 25*04fd306cSNickeau { 26*04fd306cSNickeau if ($service === null) { // TODO: Remove the condition (always create default service) 27*04fd306cSNickeau $service = ChromeDriverService::createDefaultService(); 28*04fd306cSNickeau } 29*04fd306cSNickeau 30*04fd306cSNickeau return static::startUsingDriverService($service, $desired_capabilities); 31*04fd306cSNickeau } 32*04fd306cSNickeau 33*04fd306cSNickeau /** 34*04fd306cSNickeau * Creates a new ChromeDriver using given ChromeDriverService. 35*04fd306cSNickeau * This is usable when you for example don't want to start new chromedriver process for each individual test 36*04fd306cSNickeau * and want to reuse the already started chromedriver, which will lower the overhead associated with spinning up 37*04fd306cSNickeau * a new process. 38*04fd306cSNickeau 39*04fd306cSNickeau * @return static 40*04fd306cSNickeau */ 41*04fd306cSNickeau public static function startUsingDriverService( 42*04fd306cSNickeau ChromeDriverService $service, 43*04fd306cSNickeau DesiredCapabilities $capabilities = null 44*04fd306cSNickeau ) { 45*04fd306cSNickeau if ($capabilities === null) { 46*04fd306cSNickeau $capabilities = DesiredCapabilities::chrome(); 47*04fd306cSNickeau } 48*04fd306cSNickeau 49*04fd306cSNickeau $executor = new DriverCommandExecutor($service); 50*04fd306cSNickeau $newSessionCommand = WebDriverCommand::newSession( 51*04fd306cSNickeau [ 52*04fd306cSNickeau 'capabilities' => [ 53*04fd306cSNickeau 'firstMatch' => [(object) $capabilities->toW3cCompatibleArray()], 54*04fd306cSNickeau ], 55*04fd306cSNickeau 'desiredCapabilities' => (object) $capabilities->toArray(), 56*04fd306cSNickeau ] 57*04fd306cSNickeau ); 58*04fd306cSNickeau 59*04fd306cSNickeau $response = $executor->execute($newSessionCommand); 60*04fd306cSNickeau 61*04fd306cSNickeau /* 62*04fd306cSNickeau * TODO: in next major version we may not need to use this method, because without OSS compatibility the 63*04fd306cSNickeau * driver creation is straightforward. 64*04fd306cSNickeau */ 65*04fd306cSNickeau return static::createFromResponse($response, $executor); 66*04fd306cSNickeau } 67*04fd306cSNickeau 68*04fd306cSNickeau /** 69*04fd306cSNickeau * @todo Remove in next major version. The class is internally no longer used and is kept only to keep BC. 70*04fd306cSNickeau * @deprecated Use start or startUsingDriverService method instead. 71*04fd306cSNickeau * @codeCoverageIgnore 72*04fd306cSNickeau * @internal 73*04fd306cSNickeau */ 74*04fd306cSNickeau public function startSession(DesiredCapabilities $desired_capabilities) 75*04fd306cSNickeau { 76*04fd306cSNickeau $command = WebDriverCommand::newSession( 77*04fd306cSNickeau [ 78*04fd306cSNickeau 'capabilities' => [ 79*04fd306cSNickeau 'firstMatch' => [(object) $desired_capabilities->toW3cCompatibleArray()], 80*04fd306cSNickeau ], 81*04fd306cSNickeau 'desiredCapabilities' => (object) $desired_capabilities->toArray(), 82*04fd306cSNickeau ] 83*04fd306cSNickeau ); 84*04fd306cSNickeau $response = $this->executor->execute($command); 85*04fd306cSNickeau $value = $response->getValue(); 86*04fd306cSNickeau 87*04fd306cSNickeau if (!$this->isW3cCompliant = isset($value['capabilities'])) { 88*04fd306cSNickeau $this->executor->disableW3cCompliance(); 89*04fd306cSNickeau } 90*04fd306cSNickeau 91*04fd306cSNickeau $this->sessionID = $response->getSessionID(); 92*04fd306cSNickeau } 93*04fd306cSNickeau 94*04fd306cSNickeau /** 95*04fd306cSNickeau * @return ChromeDevToolsDriver 96*04fd306cSNickeau */ 97*04fd306cSNickeau public function getDevTools() 98*04fd306cSNickeau { 99*04fd306cSNickeau if ($this->devTools === null) { 100*04fd306cSNickeau $this->devTools = new ChromeDevToolsDriver($this); 101*04fd306cSNickeau } 102*04fd306cSNickeau 103*04fd306cSNickeau return $this->devTools; 104*04fd306cSNickeau } 105*04fd306cSNickeau} 106