xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/Interactions/WebDriverActions.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace Facebook\WebDriver\Interactions;
4*04fd306cSNickeau
5*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverButtonReleaseAction;
6*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverClickAction;
7*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverClickAndHoldAction;
8*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverContextClickAction;
9*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverDoubleClickAction;
10*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverKeyDownAction;
11*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverKeyUpAction;
12*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverMouseMoveAction;
13*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverMoveToOffsetAction;
14*04fd306cSNickeauuse Facebook\WebDriver\Interactions\Internal\WebDriverSendKeysAction;
15*04fd306cSNickeauuse Facebook\WebDriver\WebDriverElement;
16*04fd306cSNickeauuse Facebook\WebDriver\WebDriverHasInputDevices;
17*04fd306cSNickeau
18*04fd306cSNickeau/**
19*04fd306cSNickeau * WebDriver action builder. It implements the builder pattern.
20*04fd306cSNickeau */
21*04fd306cSNickeauclass WebDriverActions
22*04fd306cSNickeau{
23*04fd306cSNickeau    protected $driver;
24*04fd306cSNickeau    protected $keyboard;
25*04fd306cSNickeau    protected $mouse;
26*04fd306cSNickeau    protected $action;
27*04fd306cSNickeau
28*04fd306cSNickeau    /**
29*04fd306cSNickeau     * @param WebDriverHasInputDevices $driver
30*04fd306cSNickeau     */
31*04fd306cSNickeau    public function __construct(WebDriverHasInputDevices $driver)
32*04fd306cSNickeau    {
33*04fd306cSNickeau        $this->driver = $driver;
34*04fd306cSNickeau        $this->keyboard = $driver->getKeyboard();
35*04fd306cSNickeau        $this->mouse = $driver->getMouse();
36*04fd306cSNickeau        $this->action = new WebDriverCompositeAction();
37*04fd306cSNickeau    }
38*04fd306cSNickeau
39*04fd306cSNickeau    /**
40*04fd306cSNickeau     * A convenience method for performing the actions without calling build().
41*04fd306cSNickeau     */
42*04fd306cSNickeau    public function perform()
43*04fd306cSNickeau    {
44*04fd306cSNickeau        $this->action->perform();
45*04fd306cSNickeau    }
46*04fd306cSNickeau
47*04fd306cSNickeau    /**
48*04fd306cSNickeau     * Mouse click.
49*04fd306cSNickeau     * If $element is provided, move to the middle of the element first.
50*04fd306cSNickeau     *
51*04fd306cSNickeau     * @param WebDriverElement $element
52*04fd306cSNickeau     * @return WebDriverActions
53*04fd306cSNickeau     */
54*04fd306cSNickeau    public function click(WebDriverElement $element = null)
55*04fd306cSNickeau    {
56*04fd306cSNickeau        $this->action->addAction(
57*04fd306cSNickeau            new WebDriverClickAction($this->mouse, $element)
58*04fd306cSNickeau        );
59*04fd306cSNickeau
60*04fd306cSNickeau        return $this;
61*04fd306cSNickeau    }
62*04fd306cSNickeau
63*04fd306cSNickeau    /**
64*04fd306cSNickeau     * Mouse click and hold.
65*04fd306cSNickeau     * If $element is provided, move to the middle of the element first.
66*04fd306cSNickeau     *
67*04fd306cSNickeau     * @param WebDriverElement $element
68*04fd306cSNickeau     * @return WebDriverActions
69*04fd306cSNickeau     */
70*04fd306cSNickeau    public function clickAndHold(WebDriverElement $element = null)
71*04fd306cSNickeau    {
72*04fd306cSNickeau        $this->action->addAction(
73*04fd306cSNickeau            new WebDriverClickAndHoldAction($this->mouse, $element)
74*04fd306cSNickeau        );
75*04fd306cSNickeau
76*04fd306cSNickeau        return $this;
77*04fd306cSNickeau    }
78*04fd306cSNickeau
79*04fd306cSNickeau    /**
80*04fd306cSNickeau     * Context-click (right click).
81*04fd306cSNickeau     * If $element is provided, move to the middle of the element first.
82*04fd306cSNickeau     *
83*04fd306cSNickeau     * @param WebDriverElement $element
84*04fd306cSNickeau     * @return WebDriverActions
85*04fd306cSNickeau     */
86*04fd306cSNickeau    public function contextClick(WebDriverElement $element = null)
87*04fd306cSNickeau    {
88*04fd306cSNickeau        $this->action->addAction(
89*04fd306cSNickeau            new WebDriverContextClickAction($this->mouse, $element)
90*04fd306cSNickeau        );
91*04fd306cSNickeau
92*04fd306cSNickeau        return $this;
93*04fd306cSNickeau    }
94*04fd306cSNickeau
95*04fd306cSNickeau    /**
96*04fd306cSNickeau     * Double click.
97*04fd306cSNickeau     * If $element is provided, move to the middle of the element first.
98*04fd306cSNickeau     *
99*04fd306cSNickeau     * @param WebDriverElement $element
100*04fd306cSNickeau     * @return WebDriverActions
101*04fd306cSNickeau     */
102*04fd306cSNickeau    public function doubleClick(WebDriverElement $element = null)
103*04fd306cSNickeau    {
104*04fd306cSNickeau        $this->action->addAction(
105*04fd306cSNickeau            new WebDriverDoubleClickAction($this->mouse, $element)
106*04fd306cSNickeau        );
107*04fd306cSNickeau
108*04fd306cSNickeau        return $this;
109*04fd306cSNickeau    }
110*04fd306cSNickeau
111*04fd306cSNickeau    /**
112*04fd306cSNickeau     * Drag and drop from $source to $target.
113*04fd306cSNickeau     *
114*04fd306cSNickeau     * @param WebDriverElement $source
115*04fd306cSNickeau     * @param WebDriverElement $target
116*04fd306cSNickeau     * @return WebDriverActions
117*04fd306cSNickeau     */
118*04fd306cSNickeau    public function dragAndDrop(WebDriverElement $source, WebDriverElement $target)
119*04fd306cSNickeau    {
120*04fd306cSNickeau        $this->action->addAction(
121*04fd306cSNickeau            new WebDriverClickAndHoldAction($this->mouse, $source)
122*04fd306cSNickeau        );
123*04fd306cSNickeau        $this->action->addAction(
124*04fd306cSNickeau            new WebDriverMouseMoveAction($this->mouse, $target)
125*04fd306cSNickeau        );
126*04fd306cSNickeau        $this->action->addAction(
127*04fd306cSNickeau            new WebDriverButtonReleaseAction($this->mouse, $target)
128*04fd306cSNickeau        );
129*04fd306cSNickeau
130*04fd306cSNickeau        return $this;
131*04fd306cSNickeau    }
132*04fd306cSNickeau
133*04fd306cSNickeau    /**
134*04fd306cSNickeau     * Drag $source and drop by offset ($x_offset, $y_offset).
135*04fd306cSNickeau     *
136*04fd306cSNickeau     * @param WebDriverElement $source
137*04fd306cSNickeau     * @param int $x_offset
138*04fd306cSNickeau     * @param int $y_offset
139*04fd306cSNickeau     * @return WebDriverActions
140*04fd306cSNickeau     */
141*04fd306cSNickeau    public function dragAndDropBy(WebDriverElement $source, $x_offset, $y_offset)
142*04fd306cSNickeau    {
143*04fd306cSNickeau        $this->action->addAction(
144*04fd306cSNickeau            new WebDriverClickAndHoldAction($this->mouse, $source)
145*04fd306cSNickeau        );
146*04fd306cSNickeau        $this->action->addAction(
147*04fd306cSNickeau            new WebDriverMoveToOffsetAction($this->mouse, null, $x_offset, $y_offset)
148*04fd306cSNickeau        );
149*04fd306cSNickeau        $this->action->addAction(
150*04fd306cSNickeau            new WebDriverButtonReleaseAction($this->mouse, null)
151*04fd306cSNickeau        );
152*04fd306cSNickeau
153*04fd306cSNickeau        return $this;
154*04fd306cSNickeau    }
155*04fd306cSNickeau
156*04fd306cSNickeau    /**
157*04fd306cSNickeau     * Mouse move by offset.
158*04fd306cSNickeau     *
159*04fd306cSNickeau     * @param int $x_offset
160*04fd306cSNickeau     * @param int $y_offset
161*04fd306cSNickeau     * @return WebDriverActions
162*04fd306cSNickeau     */
163*04fd306cSNickeau    public function moveByOffset($x_offset, $y_offset)
164*04fd306cSNickeau    {
165*04fd306cSNickeau        $this->action->addAction(
166*04fd306cSNickeau            new WebDriverMoveToOffsetAction($this->mouse, null, $x_offset, $y_offset)
167*04fd306cSNickeau        );
168*04fd306cSNickeau
169*04fd306cSNickeau        return $this;
170*04fd306cSNickeau    }
171*04fd306cSNickeau
172*04fd306cSNickeau    /**
173*04fd306cSNickeau     * Move to the middle of the given WebDriverElement.
174*04fd306cSNickeau     * Extra shift, calculated from the top-left corner of the element, can be set by passing $x_offset and $y_offset
175*04fd306cSNickeau     * parameters.
176*04fd306cSNickeau     *
177*04fd306cSNickeau     * @param WebDriverElement $element
178*04fd306cSNickeau     * @param int $x_offset
179*04fd306cSNickeau     * @param int $y_offset
180*04fd306cSNickeau     * @return WebDriverActions
181*04fd306cSNickeau     */
182*04fd306cSNickeau    public function moveToElement(WebDriverElement $element, $x_offset = null, $y_offset = null)
183*04fd306cSNickeau    {
184*04fd306cSNickeau        $this->action->addAction(new WebDriverMoveToOffsetAction(
185*04fd306cSNickeau            $this->mouse,
186*04fd306cSNickeau            $element,
187*04fd306cSNickeau            $x_offset,
188*04fd306cSNickeau            $y_offset
189*04fd306cSNickeau        ));
190*04fd306cSNickeau
191*04fd306cSNickeau        return $this;
192*04fd306cSNickeau    }
193*04fd306cSNickeau
194*04fd306cSNickeau    /**
195*04fd306cSNickeau     * Release the mouse button.
196*04fd306cSNickeau     * If $element is provided, move to the middle of the element first.
197*04fd306cSNickeau     *
198*04fd306cSNickeau     * @param WebDriverElement $element
199*04fd306cSNickeau     * @return WebDriverActions
200*04fd306cSNickeau     */
201*04fd306cSNickeau    public function release(WebDriverElement $element = null)
202*04fd306cSNickeau    {
203*04fd306cSNickeau        $this->action->addAction(
204*04fd306cSNickeau            new WebDriverButtonReleaseAction($this->mouse, $element)
205*04fd306cSNickeau        );
206*04fd306cSNickeau
207*04fd306cSNickeau        return $this;
208*04fd306cSNickeau    }
209*04fd306cSNickeau
210*04fd306cSNickeau    /**
211*04fd306cSNickeau     * Press a key on keyboard.
212*04fd306cSNickeau     * If $element is provided, focus on that element first.
213*04fd306cSNickeau     *
214*04fd306cSNickeau     * @see WebDriverKeys for special keys like CONTROL, ALT, etc.
215*04fd306cSNickeau     * @param WebDriverElement $element
216*04fd306cSNickeau     * @param string $key
217*04fd306cSNickeau     * @return WebDriverActions
218*04fd306cSNickeau     */
219*04fd306cSNickeau    public function keyDown(WebDriverElement $element = null, $key = null)
220*04fd306cSNickeau    {
221*04fd306cSNickeau        $this->action->addAction(
222*04fd306cSNickeau            new WebDriverKeyDownAction($this->keyboard, $this->mouse, $element, $key)
223*04fd306cSNickeau        );
224*04fd306cSNickeau
225*04fd306cSNickeau        return $this;
226*04fd306cSNickeau    }
227*04fd306cSNickeau
228*04fd306cSNickeau    /**
229*04fd306cSNickeau     * Release a key on keyboard.
230*04fd306cSNickeau     * If $element is provided, focus on that element first.
231*04fd306cSNickeau     *
232*04fd306cSNickeau     * @see WebDriverKeys for special keys like CONTROL, ALT, etc.
233*04fd306cSNickeau     * @param WebDriverElement $element
234*04fd306cSNickeau     * @param string $key
235*04fd306cSNickeau     * @return WebDriverActions
236*04fd306cSNickeau     */
237*04fd306cSNickeau    public function keyUp(WebDriverElement $element = null, $key = null)
238*04fd306cSNickeau    {
239*04fd306cSNickeau        $this->action->addAction(
240*04fd306cSNickeau            new WebDriverKeyUpAction($this->keyboard, $this->mouse, $element, $key)
241*04fd306cSNickeau        );
242*04fd306cSNickeau
243*04fd306cSNickeau        return $this;
244*04fd306cSNickeau    }
245*04fd306cSNickeau
246*04fd306cSNickeau    /**
247*04fd306cSNickeau     * Send keys by keyboard.
248*04fd306cSNickeau     * If $element is provided, focus on that element first (using single mouse click).
249*04fd306cSNickeau     *
250*04fd306cSNickeau     * @see WebDriverKeys for special keys like CONTROL, ALT, etc.
251*04fd306cSNickeau     * @param WebDriverElement $element
252*04fd306cSNickeau     * @param string $keys
253*04fd306cSNickeau     * @return WebDriverActions
254*04fd306cSNickeau     */
255*04fd306cSNickeau    public function sendKeys(WebDriverElement $element = null, $keys = null)
256*04fd306cSNickeau    {
257*04fd306cSNickeau        $this->action->addAction(
258*04fd306cSNickeau            new WebDriverSendKeysAction(
259*04fd306cSNickeau                $this->keyboard,
260*04fd306cSNickeau                $this->mouse,
261*04fd306cSNickeau                $element,
262*04fd306cSNickeau                $keys
263*04fd306cSNickeau            )
264*04fd306cSNickeau        );
265*04fd306cSNickeau
266*04fd306cSNickeau        return $this;
267*04fd306cSNickeau    }
268*04fd306cSNickeau}
269