Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
thin php client for webdriver.
PHP
tree: b2dfc92f58

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
PHPWebDriver
test
README.md
package.xml

README.md

php-webdriver -- A very thin wrapper of WebDriver

DESCRIPTION

This client aims to be as thin as possible, abusing the dynamic nature of PHP to allow almost all API calls to be a direct transformation of what is defined in the WebDriver protocol itself.

Most clients require you to first read the protocol to see what's possible, then study the client itself to see how to call it. This hopes to eliminate the latter step, and invites you to rely almost exclusively on http://code.google.com/p/selenium/wiki/JsonWireProtocol

Each command is just the name of a function call, and each additional path is just another chained function call. The function parameter is then either an array() if the command takes JSON parameters, or an individual primitive if it takes a URL parameter.

The function's return value is exactly what is returned from the server as part of the protocol definition. If an error is returned, the function will throw the appropriate WebDriverException instance.

Note - This is a maintained clone of https://github.com/facebook/php-webdriver with following differences

  • Class names being slightly different for packaging within PEAR
  • Implementation of WebDriverWait

GETTING STARTED

  • This driver has been packaged for distribution via PEAR. So...

    pear channel-discover element-34.github.com/pear
    pear install -f element-34/PHPWebDriver
    
  • All you need as the server for this client is the selenium-server-standalone-#.jar file provided here: http://code.google.com/p/selenium/downloads/list

  • Download and run that file, replacing # with the current server version.

    java -jar selenium-server-standalone-#.jar
    
  • Then when you create a session, be sure to pass the url to where your server is running.

    // This would be the url of the host running the server-standalone.jar
    $wd_host = 'http://localhost:4444/wd/hub';
    $web_driver = new PHPWebDriver_WebDriver($wd_host);
    
    // First param to session() is the 'browserName' (default = 'firefox')
    // Second param is a JSON object of additional 'desiredCapabilities'
    
    // POST /session
    $session = $web_driver->session('firefox');
    
  • Valid browser strings

    • firefox
    • chrome
    • ie
    • internet explorer
    • opera
    • htmlunit
    • htmlunitjs
    • iphone
    • ipad
    • android

SIMPLE EXAMPLES

Note that all of these match the Protocol exactly

  • Move to a specific spot on the screen

    // POST /session/:sessionId/moveto
    $session->moveto(array('xoffset' => 3, 'yoffset' => 300));
    
  • Get the current url

    // GET /session/:sessionId/url
    $session->url();
    
  • Change focus to another frame

    // POST /session/:sessionId/frame
    $session->frame(array('id' => 'some_frame_id'));
    
  • Get a list of window handles for all open windows

    // GET /session/:sessionId/window_handles
    $session->window_handles();
    
  • Accept the currently displayed alert dialog

    // POST /session/:sessionId/accept_alert
    $session->accept_alert();
    
  • Doubleclick an element on a touch screen

    // POST session/:sessionId/touch/doubleclick
    $session->touch()->doubleclick(array('element' => $element->getID())
    
  • Check if two elements are equal

    // GET /session/:sessionId/element/:id/equals/:other
    $element->equals($other_element->getID()))
    
  • Get value of a css property on element

    // GET /session/:sessionId/element/:id/css/:propertyName
    $element->css($property_name)
    

'GET', 'POST', or 'DELETE' to the same command examples

When you can do multiple http methods for the same command, call the command directly for the 'GET', and prepend the http method for the 'POST' or 'DELETE'.

  • Set landscape orientation with 'POST'

    // POST /session/:sessionId/orientation
    $session->postOrientation(array('orientation' => 'LANDSCAPE'));
    
  • Get landscape orientation with normal 'GET'

    // GET /session/:sessionId/orientation
    $session->orientation();
    
  • Set size of window that has $window_handle with 'POST'

    // If excluded, $window_handle defaults to 'current'
    // POST /session/:sessionId/window/:windowHandle/size
    $session
      ->window($window_handle)
      ->postSize(array('width' => 10, 'height' => 10));
    
  • Get current window size with 'GET'

    // GET /session/:sessionId/window/:windowHandle/size
    $session->window()->size();
    

Some unavoidable exceptions to direct protocol translation.

  • Opening pages

    // POST /session/:sessionId/url
    $session->open('http://www.facebook.com');
    
  • Dealing with the session

    // DELETE /session/:sessionId
    $session->close();
    
    // GET /session/:sessionId
    $session->capabilities();
    
  • To find elements

    // POST /session/:sessionId/element
    $element = $session->element($using, $value);
    
    // POST /session/:sessionId/elements
    $session->elements($using, $value);
    
    // POST /session/:sessionId/element/:id/element
    $element->element($using, $value);
    
    // POST /session/:sessionId/element/:id/elements
    $element->elements($using, $value);
    
  • To get the active element

    // POST /session/:sessionId/element/active
    $session->activeElement();
    
  • To manipulate cookies

    // GET /session/:sessionId/cookie
    $session->getAllCookies();
    
    // GET /session/:sessionId/cookie
    $session->getCookie($name);
    
    // POST /session/:sessionId/cookie
    //
    // $cookie_array mandatory fields
    // - name: string
    // - vale: string
    //
    // $cookie_array optional fields
    // - path: string
    // - domain: string
    // - secure: boolean
    // - expiry: number (seconds since epoch)
    $session->setCookie($cookie_array);
    
    // DELETE /session/:sessionId/cookie
    $session->deleteAllCookies()
    
    // DELETE /session/:sessionId/cookie/:name
    $session->deleteCookie($name)
    
  • To manipulate windows

    // POST /session/:sessionId/window
    $session->focusWindow($window_handle);
    
    // DELETE /session/:sessionId/window
    $session->deleteWindow();
    

Waiting

The until function will fire until it returns something PHP considers True

  • To wait for an element that you want to use then

    $w = new PHPWebDriver_WebDriverWait($session);
    $e = $w->until(
            function($session) {
              return $session->element("id", "overlayPanelProfileovolp-pad");
            }
         );
    
  • To wait for an element's presence

     $w = new PHPWebDriver_WebDriverWait($session);
     $w->until(
        function($session) {
          return count($session->elements("id", "overlayPanelProfileovolp-pad"));
        }
     );
    

Timeouts

  • To configure implicit waits (in seconds)

    $this->$session->implicitlyWait(3);
    
  • To disable implicit waits

    $this->$session->implicitlyWait(0);
    
  • How long to wait for an execute or execute_async to (in seconds)

    $this->$session->setScriptTimeout(3);
    
  • How long to wait page loads to complete (in seconds)

    $this->$session->setPageLoadTimeout(3);
    
  • How to set the above timeouts directly. Don't do this unless you really need ms granularity

    $this->$session->setTimeouts(array('type' => 'implicit', 'ms' => 5));
    $this->$session->setTimeouts(array('type' => 'script', 'ms' => 5));
    $this->$session->setTimeouts(array('type' => 'page load', 'ms' => 5));
    

Interacting with elements

  • Sending characters per the protocol (yuck)

    $e1 = $this->session->element("id", "some id");
    $e1->value(array("value" => array("pumpkins")));
    
  • Sending characters a little nicer

    $e2 = $this->session->element("id", "some id");
    $e2->sendKeys("turtles");
    
  • Sending a 'special' character (see list at https://raw.github.com/Element-34/php-webdriver/master/PHPWebDriver/WebDriverKeys.php/)

    $e3 = $this->session->element("id", "some id");
    $e3->sendKeys(PHPWebDriver_WebDriverKeys::SpaceKey());
    
  • Advancing the page by using the space key

    $e4 = $this->session->element("tag name", "body");
    $e4->sendKeys(PHPWebDriver_WebDriverKeys::SpaceKey());
    

Proxy

  • Http proxying

    $server = 'http://localhost:4444/wd/hub';
    $driver = new PHPWebDriver_WebDriver($server);
    $desired_capabilities = array();
    $proxy = new PHPWebDriver_WebDriverProxy();
    $proxy->httpProxy = '127.0.0.1:9091;
    $proxy->add_to_capabilities($desired_capabilities);
    $session = $driver->session('firefox', $desired_capabilities);
    

Screenshotting

  • Screenshots are returned as base64 strings from the server

    $img = $session->screenshot();
    $data = base64_decode($img);
    $file = 'gramophon.com.png';
    $success = file_put_contents($file, $data);
    
Something went wrong with that request. Please try again.