xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/WebDriverWindow.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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