babazumbula
babazumbula

Reputation: 123

A good working example of Selenium2 and webdriver

I've been using selenium 1, but now want to migrate to selenium2/webdriver. To be honest, I find a little bit difficult to start with selenium2/webdriver. In essence I don't know how to work between page objects. Here is my example:

public class LoginPage {
    private final WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver; 
    }

    public void loginAs(String username, String password) {
        driver.get("http://url_to_my_webapp");        
        driver.findElement(By.id("username")).sendKeys(username);
        driver.findElement(By.id("pwd")).sendKeys(password);
        driver.findElement(By.className("button")).submit();                  
    }

    public static void main(String[] args){
        LoginPage login = new LoginPage(new FirefoxDriver());
        login.loginAs("user", "pass");
    }
}

Now, after user is logged in, a redirection to different page occurs. As far as I understand, I should now make a new page object that represents current page... The fact is I don't know how? Where can I find some good working examples which are going beyond "hello world" level? How should I continue this example?

Thanks in advance!

Upvotes: 12

Views: 56995

Answers (2)

Naishy
Naishy

Reputation: 1835

These sites both give some examples:

http://luizfar.wordpress.com/2010/09/29/page-objects/

http://www.wakaleo.com/blog/selenium-2-web-driver-the-land-where-page-objects-are-king

This page gives some details on using PageFactory to support page objects: http://code.google.com/p/selenium/wiki/PageFactory

You could extend your example to work with page objects by creating a class for each page, e.g.:

public class MainPage 
{ 
  private final WebDriver driver;  

  public MainPage(WebDriver driver) 
  {     
    this.driver = driver;  
  }   

  public void doSomething() 
  {      
    driver.findElement(By.id("something")).Click;     
  }
} 

and changing loginAs to return a class that represents the page that the browser navigates to after login:

public MainPage loginAs(String username, String password) 
{       
    driver.get("http://url_to_my_webapp");             
    driver.findElement(By.id("username")).sendKeys(username);     
    driver.findElement(By.id("pwd")).sendKeys(password);     
    driver.findElement(By.className("button")).submit();
    // Add some error checking here for login failure
    return new MainPage(driver);                   
}

Upvotes: 9

robert arles
robert arles

Reputation: 183

This question is pretty old, but I thought it might still be worth sharing.

Generally, I'll first create the required page object classes. Then I create a separate class for the test logic, where you would put your 'user workflow' of clicks and other page interactions. From the sample code provided, I'm assuming that this class would replace main(). This is also the class where I include things like testNG/junit, test annotations, and dataProviders (not strictly required, but if you use those things, that may be helpful to note) In this class, you can instantiate the classes for the pages you will interact with as you need them since the webdriver object you created controls the browser, not the page classes.

Doing things this way allows for simple changes to test workflows, and also to the page objects in case the actual pages are changed, or you just have new test requirements.

My favorite side effect of this method is that the class with the workflow can be a very readable 'script' of the test with all of the ugly details in the actual tests hidden under calls like loginPage.Login() and loginPage.LoginSucceeded() so a casual pass doesn't see the details of user credential lookups, handling 404's/400's, finding and clicking the login button, etc.

Upvotes: 5

Related Questions