SwarmPage.php #1

  • //
  • guest/
  • thomas_gray/
  • jambox/
  • main/
  • swarm/
  • tests/
  • phpunit/
  • FrontendTest/
  • pages/
  • SwarmPage.php
  • View
  • Commits
  • Open Download .zip Download (6 KB)
<?php
namespace Pages;

class SwarmPage {
    // these constants are used with locators to look up page elements
    // by default, you can reference things by CSS.
    const CLASS_NAME = 'className';
    const CSS        = 'css';
    const ID         = 'id';
    const NAME       = 'name';
    const XPATH      = 'xPath';
    const LINK       = 'linkText';
    const TAG        = 'tag';

    // the expected page url and title for verification purposes.
    public $url = '';
    public $title = '';

    /**
     * A list of known page resources for use in testing.  Contains the type
     * of identifier and the identifier itself.  See LoginPage.php for an example.
     *
     * @var type array(string, string)
     */
    public $locators = array();

    /**
     * Constructor keep a copy of the webdriver test being executed for reference.
     *
     * @param \Tests\SwarmTest $test  The WebDriver test.
     */
    public function __construct($test) {
        // allow pages to set a custom url
        $this->url = $test->url . $this->url;
        $this->test = $test;

        $this->open()->validate();
    }

    /**
     * Returns requested page element.  Valid elements are those listed in
     * $locators, as well as 'title'.  Note that title returns the actual page
     * title fetched via WebDriver, not the expected page title.
     *
     * @todo    Clean up title handling?
     *
     * @param   String $property    The requested page element's friendly name.
     * @return  PHPUnit_Extensions_Selenium2TestCase_Element || string The value of the element.
     * @throws  Exception           Throws an exception if the locator is invalid.
     */
    function __get($property) {
        // only work with defined locators; this prevents tests that don't
        // update the page information.
        if (array_key_exists($property, $this->locators)) {
            $locator = $this->locators[$property];

            // if locator is of the form 'locatorName' => '.css lookup'
            if (is_string($locator)) {
                return call_user_func(array($this->test, 'byCss'), $locator);
            }
            // if the locator is of the form 'locatorName' => array('type', 'xPath') or similar.
            else if (is_array($locator)) {
                list($type, $string) = $this->locators[$property];
                // this calls the $test->xPath, $test->id, etc method
                return call_user_func(
                    array($this->test, $this->getLocatorFunction($type)),
                    $string
                );
            } else {
                throw new Exception ('Invalid locator provided for ' . $property . '.');
            }
        } else if ($property == 'title') {
            return $this->test->title();
        }

        return $this->$property;
    }

    /**
     * Sets a property on the page.  Only specified locators are valid.
     *
     * @param string $property  The name of the specified property to set.
     * @param string $value     The value to set the property to.
     * @return \WebDriver\SwarmPage Returns $this for chaining.
     * @throws Exception        Throws an exception if an invalid locator is provided.
     */
    public function __set($property, $value) {
        // only work with defined locators; this prevents tests that don't
        // update the page information.
        if (array_key_exists($property, $this->locators)) {

            $locator = $this->locators[$property];

            // operates similar to __get functionality.
            if (is_string($locator)) {
                $element = call_user_func(array($this->test, 'byCss'), $locator);
            } else if (is_array($locator)) {
                list($type, $string) = $this->locators[$property];
                $element = call_user_func(
                    array($this->test, $this->getLocatorFunction($type)),
                    $string
                );
            } else {
                throw new Exception ('Invalid locator provided for ' . $property . '.');
            }

            // set the value.
            $element->value($value);
        } else {
            // if not a valid locator, allow tests to store page-related
            // data in the page object.
            $this->$property = $value;
        }

        return $this;
    }

    /**
     * Opens the page in the browser.
     *
     * @return \WebDriver\SwarmPage
     */
    public function open() {
        $this->test->url($this->url);
        return $this;
    }

    /**
     * Validates the page by comparing the expected url to the actual url
     * and the expected title to the actual title.
     *
     * @return \WebDriver\SwarmPage
     */
    public function validate() {
        $this->test->assertTrue(
            $this->test->url() == $this->url,
            "Page url " . $this->test->url() . " does not match expected url " . $this->url . ".\n"
        );
        if ($this->title != '') {
            $this->test->assertTrue(
                $this->test->title() == $this->title,
                "Page title " . $this->test->title() . " does not match expected title " . $this->title . ".\n"
            );
        }

        return $this;
    }

    /**
     * Helper function to authenticate a user based on provided credentials.
     * @todo Sets authentication via cookie/session.
     *
     * @param string $username  The username to authenticate with.
     * @param string $password  The password to authenticate with.
     * @param boolean $success  Whether or not success is expected.
     * @return \SwarmPage
     */
    public function loginAs($username, $password = '') {
        if (array_key_exists($username, $this->test->p4users)) {
            $user = $this->test->p4users[$username];
            $username = $user['User'];
            $password = $user['Password'];
        }

        $this->open($this->test->url . 'login');
        $this->user = $username;
        $this->password = $password;
        $submit = $this->test->byCss('div.login-dialog form [type=submit]')->click();

        return $this;
    }

    /**
     * Stringbashes the locator function name out of the short form above.
     * @param String    $type   The type of locator
     * @return String           The function name to call to use the specified locator.
     */
    public function getLocatorFunction($type) {
        return 'by' . ucfirst($type);
    }
}
# Change User Description Committed
#1 18730 Liz Lam clean up code and move things around