Selenium2和webdriver的一个很好的工作示例

时间:2011-04-05 21:14:43

标签: java webdriver selenium-webdriver

我一直在使用selenium 1,但现在想要迁移到selenium2 / webdriver。说实话,我觉得从selenium2 / webdriver开始有点困难。本质上我不知道如何在页面对象之间工作。这是我的例子:

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");
    }
}

现在,在用户登录后,将重定向到不同的页面。据我了解,我现在应该创建一个代表当前页面的新页面对象......事实是我不知道怎么做?我在哪里可以找到一些超越“你好世界”水平的好工作例子? 我该如何继续这个例子?

提前致谢!

2 个答案:

答案 0 :(得分:9)

这些网站都提供了一些例子:

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

此页面提供了使用PageFactory支持页面对象的一些细节: http://code.google.com/p/selenium/wiki/PageFactory

您可以通过为每个页面创建一个类来扩展您的示例以处理页面对象,例如:

public class MainPage 
{ 
  private final WebDriver driver;  

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

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

并更改loginAs以返回一个类,该类表示浏览器在登录后导航到的页面:

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);                   
}

答案 1 :(得分:5)

这个问题很老了,但我认为它仍然值得分享。

通常,我将首先创建所需的页面对象类。 然后,我为测试逻辑创建了一个单独的类,您可以在其中设置点击和其他页面交互的“用户工作流程”。从提供的示例代码中,我假设此类将替换main()。这也是我包含testNG / junit,test annotations和dataProviders之类的类(不是严格要求的,但是如果你使用那些东西,这可能会有所帮助)在这个类中,你可以实例化页面的类您将与作为进行交互,因为您创建的webdriver对象控制着浏览器,而不是页面类。

以这种方式执行操作可以对测试工作流进行简单的更改,也可以在更改实际页面时对页面对象进行简单更改,或者只是有新的测试要求。

我最喜欢这种方法的副作用是带有工作流的类可以是一个非常易读的测试“脚本”,实际测试中的所有丑陋细节都隐藏在loginPage.Login()和loginPage等调用之下。 LoginSucceeded()所以偶然传递不会看到用户凭据查找的详细信息,处理404的/ 400,查找和单击登录按钮等。