| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 | <?php// Copyright 2004-present Facebook. All Rights Reserved.//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at////   http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.namespace Facebook\WebDriver\Interactions;use Facebook\WebDriver\Interactions\Internal\WebDriverButtonReleaseAction;use Facebook\WebDriver\Interactions\Internal\WebDriverClickAction;use Facebook\WebDriver\Interactions\Internal\WebDriverClickAndHoldAction;use Facebook\WebDriver\Interactions\Internal\WebDriverContextClickAction;use Facebook\WebDriver\Interactions\Internal\WebDriverDoubleClickAction;use Facebook\WebDriver\Interactions\Internal\WebDriverKeyDownAction;use Facebook\WebDriver\Interactions\Internal\WebDriverKeyUpAction;use Facebook\WebDriver\Interactions\Internal\WebDriverMouseMoveAction;use Facebook\WebDriver\Interactions\Internal\WebDriverMoveToOffsetAction;use Facebook\WebDriver\Interactions\Internal\WebDriverSendKeysAction;use Facebook\WebDriver\WebDriver;use Facebook\WebDriver\WebDriverElement;use Facebook\WebDriver\WebDriverHasInputDevices;/** * WebDriver action builder. It implements the builder pattern. */class WebDriverActions{    protected $driver;    protected $keyboard;    protected $mouse;    protected $action;    /**     * @param WebDriverHasInputDevices $driver     */    public function __construct(WebDriverHasInputDevices $driver)    {        $this->driver = $driver;        $this->keyboard = $driver->getKeyboard();        $this->mouse = $driver->getMouse();        $this->action = new WebDriverCompositeAction();    }    /**     * A convenience method for performing the actions without calling build().     */    public function perform()    {        $this->action->perform();    }    /**     * Mouse click.     * If $element is provided, move to the middle of the element first.     *     * @param WebDriverElement $element     * @return WebDriverActions     */    public function click(WebDriverElement $element = null)    {        $this->action->addAction(            new WebDriverClickAction($this->mouse, $element)        );        return $this;    }    /**     * Mouse click and hold.     * If $element is provided, move to the middle of the element first.     *     * @param WebDriverElement $element     * @return WebDriverActions     */    public function clickAndHold(WebDriverElement $element = null)    {        $this->action->addAction(            new WebDriverClickAndHoldAction($this->mouse, $element)        );        return $this;    }    /**     * Context-click (right click).     * If $element is provided, move to the middle of the element first.     *     * @param WebDriverElement $element     * @return WebDriverActions     */    public function contextClick(WebDriverElement $element = null)    {        $this->action->addAction(            new WebDriverContextClickAction($this->mouse, $element)        );        return $this;    }    /**     * Double click.     * If $element is provided, move to the middle of the element first.     *     * @param WebDriverElement $element     * @return WebDriverActions     */    public function doubleClick(WebDriverElement $element = null)    {        $this->action->addAction(            new WebDriverDoubleClickAction($this->mouse, $element)        );        return $this;    }    /**     * Drag and drop from $source to $target.     *     * @param WebDriverElement $source     * @param WebDriverElement $target     * @return WebDriverActions     */    public function dragAndDrop(WebDriverElement $source, WebDriverElement $target)    {        $this->action->addAction(            new WebDriverClickAndHoldAction($this->mouse, $source)        );        $this->action->addAction(            new WebDriverMouseMoveAction($this->mouse, $target)        );        $this->action->addAction(            new WebDriverButtonReleaseAction($this->mouse, $target)        );        return $this;    }    /**     * Drag $source and drop by offset ($x_offset, $y_offset).     *     * @param WebDriverElement $source     * @param int $x_offset     * @param int $y_offset     * @return WebDriverActions     */    public function dragAndDropBy(WebDriverElement $source, $x_offset, $y_offset)    {        $this->action->addAction(            new WebDriverClickAndHoldAction($this->mouse, $source)        );        $this->action->addAction(            new WebDriverMoveToOffsetAction($this->mouse, null, $x_offset, $y_offset)        );        $this->action->addAction(            new WebDriverButtonReleaseAction($this->mouse, null)        );        return $this;    }    /**     * Mouse move by offset.     *     * @param int $x_offset     * @param int $y_offset     * @return WebDriverActions     */    public function moveByOffset($x_offset, $y_offset)    {        $this->action->addAction(            new WebDriverMoveToOffsetAction($this->mouse, null, $x_offset, $y_offset)        );        return $this;    }    /**     * Move to the middle of the given WebDriverElement.     * Extra shift, calculated from the top-left corner of the element, can be set by passing $x_offset and $y_offset     * parameters.     *     * @param WebDriverElement $element     * @param int $x_offset     * @param int $y_offset     * @return WebDriverActions     */    public function moveToElement(WebDriverElement $element, $x_offset = null, $y_offset = null)    {        $this->action->addAction(new WebDriverMoveToOffsetAction(            $this->mouse,            $element,            $x_offset,            $y_offset        ));        return $this;    }    /**     * Release the mouse button.     * If $element is provided, move to the middle of the element first.     *     * @param WebDriverElement $element     * @return WebDriverActions     */    public function release(WebDriverElement $element = null)    {        $this->action->addAction(            new WebDriverButtonReleaseAction($this->mouse, $element)        );        return $this;    }    /**     * Press a key on keyboard.     * If $element is provided, focus on that element first.     *     * @see WebDriverKeys for special keys like CONTROL, ALT, etc.     * @param WebDriverElement $element     * @param string $key     * @return WebDriverActions     */    public function keyDown(WebDriverElement $element = null, $key = null)    {        $this->action->addAction(            new WebDriverKeyDownAction($this->keyboard, $this->mouse, $element, $key)        );        return $this;    }    /**     * Release a key on keyboard.     * If $element is provided, focus on that element first.     *     * @see WebDriverKeys for special keys like CONTROL, ALT, etc.     * @param WebDriverElement $element     * @param string $key     * @return WebDriverActions     */    public function keyUp(WebDriverElement $element = null, $key = null)    {        $this->action->addAction(            new WebDriverKeyUpAction($this->keyboard, $this->mouse, $element, $key)        );        return $this;    }    /**     * Send keys by keyboard.     * If $element is provided, focus on that element first.     *     * @see WebDriverKeys for special keys like CONTROL, ALT, etc.     * @param WebDriverElement $element     * @param string $keys     * @return WebDriverActions     */    public function sendKeys(WebDriverElement $element = null, $keys = null)    {        $this->action->addAction(            new WebDriverSendKeysAction(                $this->keyboard,                $this->mouse,                $element,                $keys            )        );        return $this;    }}
 |