1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Facebook\WebDriver\Exception\NoSuchCookieException; 6*04fd306cSNickeauuse Facebook\WebDriver\Remote\DriverCommand; 7*04fd306cSNickeauuse Facebook\WebDriver\Remote\ExecuteMethod; 8*04fd306cSNickeauuse InvalidArgumentException; 9*04fd306cSNickeau 10*04fd306cSNickeau/** 11*04fd306cSNickeau * Managing stuff you would do in a browser. 12*04fd306cSNickeau */ 13*04fd306cSNickeauclass WebDriverOptions 14*04fd306cSNickeau{ 15*04fd306cSNickeau /** 16*04fd306cSNickeau * @var ExecuteMethod 17*04fd306cSNickeau */ 18*04fd306cSNickeau protected $executor; 19*04fd306cSNickeau /** 20*04fd306cSNickeau * @var bool 21*04fd306cSNickeau */ 22*04fd306cSNickeau protected $isW3cCompliant; 23*04fd306cSNickeau 24*04fd306cSNickeau public function __construct(ExecuteMethod $executor, $isW3cCompliant = false) 25*04fd306cSNickeau { 26*04fd306cSNickeau $this->executor = $executor; 27*04fd306cSNickeau $this->isW3cCompliant = $isW3cCompliant; 28*04fd306cSNickeau } 29*04fd306cSNickeau 30*04fd306cSNickeau /** 31*04fd306cSNickeau * Add a specific cookie. 32*04fd306cSNickeau * 33*04fd306cSNickeau * @see Cookie for description of possible cookie properties 34*04fd306cSNickeau * @param Cookie|array $cookie Cookie object. May be also created from array for compatibility reasons. 35*04fd306cSNickeau * @return WebDriverOptions The current instance. 36*04fd306cSNickeau */ 37*04fd306cSNickeau public function addCookie($cookie) 38*04fd306cSNickeau { 39*04fd306cSNickeau if (is_array($cookie)) { // @todo @deprecated remove in 2.0 40*04fd306cSNickeau $cookie = Cookie::createFromArray($cookie); 41*04fd306cSNickeau } 42*04fd306cSNickeau if (!$cookie instanceof Cookie) { 43*04fd306cSNickeau throw new InvalidArgumentException('Cookie must be set from instance of Cookie class or from array.'); 44*04fd306cSNickeau } 45*04fd306cSNickeau 46*04fd306cSNickeau $this->executor->execute( 47*04fd306cSNickeau DriverCommand::ADD_COOKIE, 48*04fd306cSNickeau ['cookie' => $cookie->toArray()] 49*04fd306cSNickeau ); 50*04fd306cSNickeau 51*04fd306cSNickeau return $this; 52*04fd306cSNickeau } 53*04fd306cSNickeau 54*04fd306cSNickeau /** 55*04fd306cSNickeau * Delete all the cookies that are currently visible. 56*04fd306cSNickeau * 57*04fd306cSNickeau * @return WebDriverOptions The current instance. 58*04fd306cSNickeau */ 59*04fd306cSNickeau public function deleteAllCookies() 60*04fd306cSNickeau { 61*04fd306cSNickeau $this->executor->execute(DriverCommand::DELETE_ALL_COOKIES); 62*04fd306cSNickeau 63*04fd306cSNickeau return $this; 64*04fd306cSNickeau } 65*04fd306cSNickeau 66*04fd306cSNickeau /** 67*04fd306cSNickeau * Delete the cookie with the given name. 68*04fd306cSNickeau * 69*04fd306cSNickeau * @param string $name 70*04fd306cSNickeau * @return WebDriverOptions The current instance. 71*04fd306cSNickeau */ 72*04fd306cSNickeau public function deleteCookieNamed($name) 73*04fd306cSNickeau { 74*04fd306cSNickeau $this->executor->execute( 75*04fd306cSNickeau DriverCommand::DELETE_COOKIE, 76*04fd306cSNickeau [':name' => $name] 77*04fd306cSNickeau ); 78*04fd306cSNickeau 79*04fd306cSNickeau return $this; 80*04fd306cSNickeau } 81*04fd306cSNickeau 82*04fd306cSNickeau /** 83*04fd306cSNickeau * Get the cookie with a given name. 84*04fd306cSNickeau * 85*04fd306cSNickeau * @param string $name 86*04fd306cSNickeau * @throws NoSuchCookieException In W3C compliant mode if no cookie with the given name is present 87*04fd306cSNickeau * @return Cookie|null The cookie, or null in JsonWire mode if no cookie with the given name is present 88*04fd306cSNickeau */ 89*04fd306cSNickeau public function getCookieNamed($name) 90*04fd306cSNickeau { 91*04fd306cSNickeau if ($this->isW3cCompliant) { 92*04fd306cSNickeau $cookieArray = $this->executor->execute( 93*04fd306cSNickeau DriverCommand::GET_NAMED_COOKIE, 94*04fd306cSNickeau [':name' => $name] 95*04fd306cSNickeau ); 96*04fd306cSNickeau 97*04fd306cSNickeau if (!is_array($cookieArray)) { // Microsoft Edge returns null even in W3C mode => emulate proper behavior 98*04fd306cSNickeau throw new NoSuchCookieException('no such cookie'); 99*04fd306cSNickeau } 100*04fd306cSNickeau 101*04fd306cSNickeau return Cookie::createFromArray($cookieArray); 102*04fd306cSNickeau } 103*04fd306cSNickeau 104*04fd306cSNickeau $cookies = $this->getCookies(); 105*04fd306cSNickeau foreach ($cookies as $cookie) { 106*04fd306cSNickeau if ($cookie['name'] === $name) { 107*04fd306cSNickeau return $cookie; 108*04fd306cSNickeau } 109*04fd306cSNickeau } 110*04fd306cSNickeau 111*04fd306cSNickeau return null; 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau /** 115*04fd306cSNickeau * Get all the cookies for the current domain. 116*04fd306cSNickeau * 117*04fd306cSNickeau * @return Cookie[] The array of cookies presented. 118*04fd306cSNickeau */ 119*04fd306cSNickeau public function getCookies() 120*04fd306cSNickeau { 121*04fd306cSNickeau $cookieArrays = $this->executor->execute(DriverCommand::GET_ALL_COOKIES); 122*04fd306cSNickeau if (!is_array($cookieArrays)) { // Microsoft Edge returns null if there are no cookies... 123*04fd306cSNickeau return []; 124*04fd306cSNickeau } 125*04fd306cSNickeau 126*04fd306cSNickeau $cookies = []; 127*04fd306cSNickeau foreach ($cookieArrays as $cookieArray) { 128*04fd306cSNickeau $cookies[] = Cookie::createFromArray($cookieArray); 129*04fd306cSNickeau } 130*04fd306cSNickeau 131*04fd306cSNickeau return $cookies; 132*04fd306cSNickeau } 133*04fd306cSNickeau 134*04fd306cSNickeau /** 135*04fd306cSNickeau * Return the interface for managing driver timeouts. 136*04fd306cSNickeau * 137*04fd306cSNickeau * @return WebDriverTimeouts 138*04fd306cSNickeau */ 139*04fd306cSNickeau public function timeouts() 140*04fd306cSNickeau { 141*04fd306cSNickeau return new WebDriverTimeouts($this->executor, $this->isW3cCompliant); 142*04fd306cSNickeau } 143*04fd306cSNickeau 144*04fd306cSNickeau /** 145*04fd306cSNickeau * An abstraction allowing the driver to manipulate the browser's window 146*04fd306cSNickeau * 147*04fd306cSNickeau * @return WebDriverWindow 148*04fd306cSNickeau * @see WebDriverWindow 149*04fd306cSNickeau */ 150*04fd306cSNickeau public function window() 151*04fd306cSNickeau { 152*04fd306cSNickeau return new WebDriverWindow($this->executor, $this->isW3cCompliant); 153*04fd306cSNickeau } 154*04fd306cSNickeau 155*04fd306cSNickeau /** 156*04fd306cSNickeau * Get the log for a given log type. Log buffer is reset after each request. 157*04fd306cSNickeau * 158*04fd306cSNickeau * @param string $log_type The log type. 159*04fd306cSNickeau * @return array The list of log entries. 160*04fd306cSNickeau * @see https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#log-type 161*04fd306cSNickeau */ 162*04fd306cSNickeau public function getLog($log_type) 163*04fd306cSNickeau { 164*04fd306cSNickeau return $this->executor->execute( 165*04fd306cSNickeau DriverCommand::GET_LOG, 166*04fd306cSNickeau ['type' => $log_type] 167*04fd306cSNickeau ); 168*04fd306cSNickeau } 169*04fd306cSNickeau 170*04fd306cSNickeau /** 171*04fd306cSNickeau * Get available log types. 172*04fd306cSNickeau * 173*04fd306cSNickeau * @return array The list of available log types. 174*04fd306cSNickeau * @see https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#log-type 175*04fd306cSNickeau */ 176*04fd306cSNickeau public function getAvailableLogTypes() 177*04fd306cSNickeau { 178*04fd306cSNickeau return $this->executor->execute(DriverCommand::GET_AVAILABLE_LOG_TYPES); 179*04fd306cSNickeau } 180*04fd306cSNickeau} 181