-
Notifications
You must be signed in to change notification settings - Fork 55
Example command reference
Here is my attempt at helping others learn to use this binding. Others out there who are more experienced with this PHP binding, please add to this page as you get to it please.
NOTE: some examples below may be done shorthand, in single line chained calls from the session object, though if we wanted to perform several actions on the same element, we could save the WebDriverElement into a variable and then make subsequent calls from that element.
$result = $session->element('id','signin')->text();
//POST w/ empty data to click command. using just click() may work for you too.
$session->element('id','signin')->click("");
Values must be sent as an array of key presses.
You could use a function from another webdriver php project (https://github.com/chibimagic/WebDriver-PHP):
function split_keys($toSend){
$payload = array("value" => preg_split("//u", $toSend, -1, PREG_SPLIT_NO_EMPTY));
return $payload;
}
This can be used:
$session->element("id", "element id")->value(split_keys("I want to send this"))
Or more simply, it may work to just do:
$session->element("id", "element id")->value(array('value' => str_split("I want to send this")));
Or you can try setting the text inputs value directly via javascript like this:
$script = 'arguments[0].value = arguments[1];';
$args = array(array('ELEMENT' => $this->getID()), "I want to send this")));
$session->execute(array('script' => $script, 'args' => $args));
If a text field already has a non-empty value and you want to update that field, here's how to clear the existing value:
$session->element("id", "element id")->clear();
TBD - how to do this? Can refer to JSONWireProtocol, but how to send the keycode?
$attr = $session->element('id','signin')->attribute('maxlength');
// no direct method to call like $element->value(); since that is not in the protocol
$element->attribute("value");
$imgData = base64_decode($session->screenshot());
file_put_contents('screenshot.png', $imgData);
//this requires a sequence of steps as follows:
//1st find the source and target/destination elements to use as reference to do the drag and drop
$from = $session->element('xpath',"//div[@class='here']");
$to = $session->element('id','there');
//now perform drag and drop
$session->moveto(array('element' => $from->getID())); //move to source location, using reference to source element
$session->buttondown(""); //click mouse to start drag, defaults to left mouse button
$session->moveto(array('element' => $to->getID())); //move to target location, using reference to target element
$session->buttonup(""); //release mouse to complete drag and drop operation
//it may be worthwhile to encapsulate these steps into a function called draganddrop($src,$target), etc.
Remember that the script you run is implicitly inserted into an anonymous javascript function.
That means if you want to access global variables, you have to use the full name of the variable,
for example window.document
$sScriptResult = $session->execute(array(
'script' => 'return window.document.location.hostname',
'args' => array(),
));
$sScriptResult
now holds the value of the current document hostname
Make sure you tell the server how long it should wait before it gives up on your script and throws a timeout exception.
// wait at most 5 seconds before giving up with a timeout exception
$session->timeouts()->async_script(array('ms'=>5000));
Similar to synchronous script, the async script is wrapped in an anonymous function.
$sResult = $session->execute_async(array(
'script' => 'arguments[arguments.length-1]("done");',
'args' => array(),
));
$sResult
== "done"
In the example below, we poll the global window.MY_STUFF_DONE
value at regular intervals,
waiting for it to exist with a non-false value. Once we see it, we return back to the
calling php-webdriver code with the value "done"
.
// define the javascript code to execute. This just checks at a periodic
// interval to see if your page created the window.MY_STUFF_DONE variable
$sJavascript = <<<END_JAVASCRIPT
var callback = arguments[arguments.length-1], // webdriver async script callback
nIntervalId; // setInterval id to stop polling
function checkDone() {
if( window.MY_STUFF_DONE ) {
window.clearInterval(nIntervalId); // stop polling
callback("done"); // return "done" to PHP code
}
}
nIntervalId = window.setInterval( checkDone, 50 ); // start polling
END_JAVASCRIPT;
$sResult = $session->execute_async(array(
'script' => $sJavascript,
'args' => array(),
));
$sResult
== "done"
$handle = $session->window_handle();
$handles = $session->window_handles(); //now can iterate through array to get desired handle
See project home page or the readme file for examples
See project home page or the readme file for examples
// Open URL
$session->open('http://www.facebook.com/cocacola');
// Grab hold of the ID of your iframe
$id = $session->element('xpath', "//div[@id='pagelet_app_runner']//iframe")->attribute('id');
// Switch frames using that ID
$session->frame(array('id'=>$id));
// Output the HTML so we can see the right frame was selected
echo $session->source();
// Do element queries as normal
var_dump($session->element('id', "bottom]")->displayed());