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