1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Facebook\WebDriver\Exception\IndexOutOfBoundsException; 6*04fd306cSNickeauuse Facebook\WebDriver\Exception\UnsupportedOperationException; 7*04fd306cSNickeauuse Facebook\WebDriver\Remote\DriverCommand; 8*04fd306cSNickeauuse Facebook\WebDriver\Remote\ExecuteMethod; 9*04fd306cSNickeau 10*04fd306cSNickeau/** 11*04fd306cSNickeau * An abstraction allowing the driver to manipulate the browser's window 12*04fd306cSNickeau */ 13*04fd306cSNickeauclass WebDriverWindow 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 * Get the position of the current window, relative to the upper left corner 32*04fd306cSNickeau * of the screen. 33*04fd306cSNickeau * 34*04fd306cSNickeau * @return WebDriverPoint The current window position. 35*04fd306cSNickeau */ 36*04fd306cSNickeau public function getPosition() 37*04fd306cSNickeau { 38*04fd306cSNickeau $position = $this->executor->execute( 39*04fd306cSNickeau DriverCommand::GET_WINDOW_POSITION, 40*04fd306cSNickeau [':windowHandle' => 'current'] 41*04fd306cSNickeau ); 42*04fd306cSNickeau 43*04fd306cSNickeau return new WebDriverPoint( 44*04fd306cSNickeau $position['x'], 45*04fd306cSNickeau $position['y'] 46*04fd306cSNickeau ); 47*04fd306cSNickeau } 48*04fd306cSNickeau 49*04fd306cSNickeau /** 50*04fd306cSNickeau * Get the size of the current window. This will return the outer window 51*04fd306cSNickeau * dimension, not just the view port. 52*04fd306cSNickeau * 53*04fd306cSNickeau * @return WebDriverDimension The current window size. 54*04fd306cSNickeau */ 55*04fd306cSNickeau public function getSize() 56*04fd306cSNickeau { 57*04fd306cSNickeau $size = $this->executor->execute( 58*04fd306cSNickeau DriverCommand::GET_WINDOW_SIZE, 59*04fd306cSNickeau [':windowHandle' => 'current'] 60*04fd306cSNickeau ); 61*04fd306cSNickeau 62*04fd306cSNickeau return new WebDriverDimension( 63*04fd306cSNickeau $size['width'], 64*04fd306cSNickeau $size['height'] 65*04fd306cSNickeau ); 66*04fd306cSNickeau } 67*04fd306cSNickeau 68*04fd306cSNickeau /** 69*04fd306cSNickeau * Minimizes the current window if it is not already minimized. 70*04fd306cSNickeau * 71*04fd306cSNickeau * @return WebDriverWindow The instance. 72*04fd306cSNickeau */ 73*04fd306cSNickeau public function minimize() 74*04fd306cSNickeau { 75*04fd306cSNickeau if (!$this->isW3cCompliant) { 76*04fd306cSNickeau throw new UnsupportedOperationException('Minimize window is only supported in W3C mode'); 77*04fd306cSNickeau } 78*04fd306cSNickeau 79*04fd306cSNickeau $this->executor->execute(DriverCommand::MINIMIZE_WINDOW, []); 80*04fd306cSNickeau 81*04fd306cSNickeau return $this; 82*04fd306cSNickeau } 83*04fd306cSNickeau 84*04fd306cSNickeau /** 85*04fd306cSNickeau * Maximizes the current window if it is not already maximized 86*04fd306cSNickeau * 87*04fd306cSNickeau * @return WebDriverWindow The instance. 88*04fd306cSNickeau */ 89*04fd306cSNickeau public function maximize() 90*04fd306cSNickeau { 91*04fd306cSNickeau if ($this->isW3cCompliant) { 92*04fd306cSNickeau $this->executor->execute(DriverCommand::MAXIMIZE_WINDOW, []); 93*04fd306cSNickeau } else { 94*04fd306cSNickeau $this->executor->execute( 95*04fd306cSNickeau DriverCommand::MAXIMIZE_WINDOW, 96*04fd306cSNickeau [':windowHandle' => 'current'] 97*04fd306cSNickeau ); 98*04fd306cSNickeau } 99*04fd306cSNickeau 100*04fd306cSNickeau return $this; 101*04fd306cSNickeau } 102*04fd306cSNickeau 103*04fd306cSNickeau /** 104*04fd306cSNickeau * Makes the current window full screen. 105*04fd306cSNickeau * 106*04fd306cSNickeau * @return WebDriverWindow The instance. 107*04fd306cSNickeau */ 108*04fd306cSNickeau public function fullscreen() 109*04fd306cSNickeau { 110*04fd306cSNickeau if (!$this->isW3cCompliant) { 111*04fd306cSNickeau throw new UnsupportedOperationException('The Fullscreen window command is only supported in W3C mode'); 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau $this->executor->execute(DriverCommand::FULLSCREEN_WINDOW, []); 115*04fd306cSNickeau 116*04fd306cSNickeau return $this; 117*04fd306cSNickeau } 118*04fd306cSNickeau 119*04fd306cSNickeau /** 120*04fd306cSNickeau * Set the size of the current window. This will change the outer window 121*04fd306cSNickeau * dimension, not just the view port. 122*04fd306cSNickeau * 123*04fd306cSNickeau * @param WebDriverDimension $size 124*04fd306cSNickeau * @return WebDriverWindow The instance. 125*04fd306cSNickeau */ 126*04fd306cSNickeau public function setSize(WebDriverDimension $size) 127*04fd306cSNickeau { 128*04fd306cSNickeau $params = [ 129*04fd306cSNickeau 'width' => $size->getWidth(), 130*04fd306cSNickeau 'height' => $size->getHeight(), 131*04fd306cSNickeau ':windowHandle' => 'current', 132*04fd306cSNickeau ]; 133*04fd306cSNickeau $this->executor->execute(DriverCommand::SET_WINDOW_SIZE, $params); 134*04fd306cSNickeau 135*04fd306cSNickeau return $this; 136*04fd306cSNickeau } 137*04fd306cSNickeau 138*04fd306cSNickeau /** 139*04fd306cSNickeau * Set the position of the current window. This is relative to the upper left 140*04fd306cSNickeau * corner of the screen. 141*04fd306cSNickeau * 142*04fd306cSNickeau * @param WebDriverPoint $position 143*04fd306cSNickeau * @return WebDriverWindow The instance. 144*04fd306cSNickeau */ 145*04fd306cSNickeau public function setPosition(WebDriverPoint $position) 146*04fd306cSNickeau { 147*04fd306cSNickeau $params = [ 148*04fd306cSNickeau 'x' => $position->getX(), 149*04fd306cSNickeau 'y' => $position->getY(), 150*04fd306cSNickeau ':windowHandle' => 'current', 151*04fd306cSNickeau ]; 152*04fd306cSNickeau $this->executor->execute(DriverCommand::SET_WINDOW_POSITION, $params); 153*04fd306cSNickeau 154*04fd306cSNickeau return $this; 155*04fd306cSNickeau } 156*04fd306cSNickeau 157*04fd306cSNickeau /** 158*04fd306cSNickeau * Get the current browser orientation. 159*04fd306cSNickeau * 160*04fd306cSNickeau * @return string Either LANDSCAPE|PORTRAIT 161*04fd306cSNickeau */ 162*04fd306cSNickeau public function getScreenOrientation() 163*04fd306cSNickeau { 164*04fd306cSNickeau return $this->executor->execute(DriverCommand::GET_SCREEN_ORIENTATION); 165*04fd306cSNickeau } 166*04fd306cSNickeau 167*04fd306cSNickeau /** 168*04fd306cSNickeau * Set the browser orientation. The orientation should either 169*04fd306cSNickeau * LANDSCAPE|PORTRAIT 170*04fd306cSNickeau * 171*04fd306cSNickeau * @param string $orientation 172*04fd306cSNickeau * @throws IndexOutOfBoundsException 173*04fd306cSNickeau * @return WebDriverWindow The instance. 174*04fd306cSNickeau */ 175*04fd306cSNickeau public function setScreenOrientation($orientation) 176*04fd306cSNickeau { 177*04fd306cSNickeau $orientation = mb_strtoupper($orientation); 178*04fd306cSNickeau if (!in_array($orientation, ['PORTRAIT', 'LANDSCAPE'], true)) { 179*04fd306cSNickeau throw new IndexOutOfBoundsException( 180*04fd306cSNickeau 'Orientation must be either PORTRAIT, or LANDSCAPE' 181*04fd306cSNickeau ); 182*04fd306cSNickeau } 183*04fd306cSNickeau 184*04fd306cSNickeau $this->executor->execute( 185*04fd306cSNickeau DriverCommand::SET_SCREEN_ORIENTATION, 186*04fd306cSNickeau ['orientation' => $orientation] 187*04fd306cSNickeau ); 188*04fd306cSNickeau 189*04fd306cSNickeau return $this; 190*04fd306cSNickeau } 191*04fd306cSNickeau} 192