在页面对象模型中需要页面工厂

时间:2014-11-18 16:11:14

标签: java design-patterns selenium selenium-webdriver pageobjects

任何人都可以解释页面对象模型中页面需求是什么。

EG。我们使用下面的代码初始化页面对象类。

LoginPage loginPage = PageFactory.initElements(driver, LoginPage.class);

为什么我们不能使用

LoginPage loginPage = new LoginPage(driver);

同样,在每个页面对象方法中返回新页面时,我们使用

return new PageFactory.initElements(driver, HomePage.class);

为什么不应该

return new HomePage(driver);

请帮助我理解PageFactory,因为我是页面对象模式的新手。我想我们仍然可以在不使用PageFactory的情况下进行管理。

3 个答案:

答案 0 :(得分:3)

事实上,您可以在不使用PageFactory类的情况下使用页面对象模式。页面对象模式简单地将您的业务逻辑从页面的物理结构中抽象出来。 PageFactory类为您提供的是能够使用注释自动查找页面上的元素而无需借助明确的findElement调用。它允许你编写这样的代码:

public class LoginPage {
  @FindBy(how = How.ID, using = "user")
  private WebElement userNameTextBox;

  @FindBy(how = How.ID, using = "password")
  private WebElement passwordTextBox;

  public void fillLoginDetails(String userName, String password) {
    userNameTextBox.sendKeys(userName);
    passwordTextBox.sendKeys(password);
  }
}

请注意,此处没有明确的findElement来电。使用PageFactory允许您更干净地编写此代码并消除一些样板代码。通过在页面对象中使用findElement来定位相应的元素,可以实现同样的目的。这是一种风格选择。

答案 1 :(得分:2)

PageFactory使用您提供的WebElement在页面对象中定义WebDriver

PageFactory的文档说:

  

PageFactory依赖于使用合理的默认值:Java类中字段的名称被假定为" id"或"名称" HTML页面上的元素。

因此,您只需使用WebElement的ID或名称定义WebElement类型的字段,PageFactory就可以确保它可用。

  

我想我们仍然可以在不使用PageFactory的情况下进行管理。

是的,你可以。如果您不使用PageFactory,则必须使用WebElement API查找WebDriver,例如

WebElement searchBox = driver.findElement(By.id("q"));

但您也可以使用@FindBy@FindBys@FindAll注释字段,例如

@FindBy(how = How.ID, using = "q")
private WebElement searchBox;
  

我是页面对象模式的新手

页面对象是某个网页的封装。它的api提供了对网页的用户访问,并隐藏了页面的实现细节(网页元素,ID等)。因此,您可以用用户描述测试的方式编写测试。

例如

 @Test
 public void googleSearch(){
     WebDriver driver = ....;

     GooglePage google = GooglePage.open(driver);
     SearchResultPage searchResult = google.search("stackoverflow");
     SearchResult firstResult = searchResult.getResult(0); // first result

     Assert.assertEquals("Stack Overflow", firstResult.getTitle());
     ...
 }

答案 2 :(得分:0)

我看到你使用java作为selenium。你应该看一下Arquillian-Graphene框架。这是一个extesnion。所以它不会搞乱你现有的框架。

使用Arquillian框架的主要目的是 - 您不需要Page Factory。它有很好的注释集,可以在运行时注入页面对象模型。

例如:我为Google创建了一个页面对象,如下所示。

public class Google {

    @Drone
    private WebDriver driver;

    public void goTo(){
        driver.get("https://www.google.com");
    }

    public boolean isAt(){
        return driver.getTitle().equals("Google");
    }
}

在我的testng / junit中,

@RunAsClient
public class GoogleSearchTest extends Arquillian{

    @Page
    Google google;


    @Test(priority = 1)
    public void launchGoogle(){

        google.goTo();
        Assert.assertTrue(google.isAt());

    }

}
你注意到了吗? @Drone - 自动注入浏览器实例。 @Page自动创建一个Google页面对象实例。

点击此处了解更多信息:

http://www.testautomationguru.com/arquillian-graphene-page-fragments/