StackOverflowNewbie
StackOverflowNewbie

Reputation: 40653

Configuration File for Driving Selenium

I have about 500 possible paths to a particular page, and I need to test all of them. Each path to the that page looks similar to this (using PHP web driver; usually has about 10 steps):

// Navigate to form
$driver->get('http://www.domain.com');
$driver->get($driver->findElement(WebDriverBy::xpath("//a[contains(text(),'Foo 1')]"))->getAttribute('href'));
$driver->findElement(WebDriverBy::xpath("//div[@class='countryHeader']//a[contains(text(), 'Bar 1')]"))->click();
$driver->findElement(WebDriverBy::xpath("//form[@name='formDisclaimer']//input[contains(@class, 'button')]"))->click();

I don't want to have to write code for all the steps for all possible paths to the page. I do, however, have all the pertinent details of the steps (e.g. the XPath, the string the node may contain, etc.) in a database.

Is there a way for me to "dynamically" produce some sort of configuration file (either in XML or JSON) that I can feed to the driver as a set of instructions for it to follow?

Upvotes: 9

Views: 194

Answers (3)

rafalf
rafalf

Reputation: 435

best is to get data from db with odbc as a list (array) xpath locators and then loop over it. If you don't have a direct access to the db, export the query results as a .csv file (MS db has an option save as, not sure about the others) and then read the file and loop over the array

Upvotes: 1

PD81
PD81

Reputation: 20689

As you said you have all relevant details in the database then you just can simply read it and in a foreach loop pass to selenium driver.

or if you don't want to have a reference to the database in your test, just dump data to PHP array and add to your test class.

You just need to write a logic to transform your sql data into test. Don't need to write every test manually.

I don't know which testing framework you are using, but you can execute many tests from a single test for example in PHPUnit that would be something like:

class My_PathsTest extends PHPUnit_Framework_TestCase
{

    public function setUp() {
      // setup $this->tests here 
    }

    public function testAll() {
        // $this->tests would contain info about paths taken from database.

        $failures = array();

        foreach($this->tests as $paths_set) {
            try {

                /**
                 * $driver->get($paths_set['start_point']);
                 * foreach ($paths_set['paths'] as $path ) {
                 *  $driver->findElement(WebDriverBy::xpath($path));
                 * }
                 * 
                 * Important!!!
                 * If you didn't find something you expected 
                 * just throw the PHPUnit_Framework_ExpectationFailedException exception
                 * throw new PHPUnit_Framework_ExpectationFailedException('Element missing add some info here about which is missing etc..');
                 */

            }

            catch(PHPUnit_Framework_ExpectationFailedException $e) {
                $failures[] = $e->getMessage();
            }
        }

        if (!empty($failures)) {
            throw new PHPUnit_Framework_ExpectationFailedException(count($failures) . " assertions failed:\n\t" . implode("\n\t", $failures));
        }
    }

}

Upvotes: 1

Mrunal Gosar
Mrunal Gosar

Reputation: 4683

A long time back at one of my project I had a similar requirement. I tried to create a Robot (or someone may call Web Crawler). As I started navigating through the pages I started maintaining the navigation paths in spreadsheet, so I don't have to click on the paths manually. Once I have the paths, next time whenever a Path changes I will be notified and if it is a valid change then make that change in s/s or raise it as a bug.

Upvotes: 5

Related Questions