Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 页面对象模型中页面工厂的需求_Java_Design Patterns_Selenium_Selenium Webdriver_Pageobjects - Fatal编程技术网

Java 页面对象模型中页面工厂的需求

Java 页面对象模型中页面工厂的需求,java,design-patterns,selenium,selenium-webdriver,pageobjects,Java,Design Patterns,Selenium,Selenium Webdriver,Pageobjects,谁能解释一下页面对象模型中pagefactory的需求是什么 我们使用下面的代码初始化页面对象类 LoginPage loginPage = PageFactory.initElements(driver, LoginPage.class); 为什么我们不能使用 LoginPage loginPage = new LoginPage(driver); 同样,在我们使用的每个页面对象方法中返回新页面时 return new PageFactory.initElements(driver, Ho

谁能解释一下页面对象模型中pagefactory的需求是什么

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

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的情况下进行管理。

事实上,您可以在不使用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来定位适当的元素来实现。这是一种风格选择。

事实上,您可以使用页面对象模式,而无需使用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来定位适当的元素来实现。这是一种风格选择。

PageFactory使用您提供的WebDriver注入页面对象中定义的WebElements

文件说明:

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

因此,您可以使用WebElement的id或名称定义一个WebElement类型的字段,PageFactory会确保该字段可用

我认为我们仍然可以不用PageFactory来管理

是的,你可以。如果不使用PageFactory,则必须使用WebDriver api查找WebElements,例如:

WebElement searchBox = driver.findElement(By.id("q"));
但您也可以用@FindBy、@FindBys或@FindAll注释字段,例如

我不熟悉页面对象模式

页面对象是某个网页的封装。它的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());
     ...
 }
PageFactory使用您提供的WebDriver注入页面对象中定义的WebElements

文件说明:

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

因此,您可以使用WebElement的id或名称定义一个WebElement类型的字段,PageFactory会确保该字段可用

我认为我们仍然可以不用PageFactory来管理

是的,你可以。如果不使用PageFactory,则必须使用WebDriver api查找WebElements,例如:

WebElement searchBox = driver.findElement(By.id("q"));
但您也可以用@FindBy、@FindBys或@FindAll注释字段,例如

我不熟悉页面对象模式

页面对象是某个网页的封装。它的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());
     ...
 }

我看到您使用java来实现selenium。你应该看看阿奎尔石墨烯框架。这是一个例外。因此,它不会破坏您现有的框架

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

例如:我为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());

    }

}
你注意到了吗@无人机-自动注入浏览器实例@Page自动创建一个Google Page对象实例

查看此处了解更多信息:


我看到您使用java来实现selenium。你应该看看阿奎尔石墨烯框架。这是一个例外。因此,它不会破坏您现有的框架

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

例如:我为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());

    }

}
做过 你注意到了吗@无人机-自动注入浏览器实例@Page自动创建一个Google Page对象实例

查看此处了解更多信息:


您可以不使用PageFactory进行管理。了解设计模式。您可以不使用PageFactory进行管理。阅读设计模式。感谢您的评论。所以,既然我们在使用页面工厂时没有在LoginPage或任何页面对象中使用驱动程序实例,那么我们在哪里编写自定义等待等或任何涉及驱动程序对象的操作呢?这些等待应该是页面对象的一部分还是测试的一部分?我认为这些等待应该是页面对象的一部分。例如,如果页面包含内容由ajax调用加载的组件,则在加载之前,您的测试应该获得对该组件的引用。例如,TableComponent tc=page.getResultable。这也意味着您需要页面和组件中的web驱动程序。通常我使用LoadableComponent来实现页面和页面上的组件:感谢Rene的宝贵反馈谢谢你的评论。所以,既然我们在使用页面工厂时没有在LoginPage或任何页面对象中使用驱动程序实例,那么我们在哪里编写自定义等待等或任何涉及驱动程序对象的操作呢?这些等待应该是页面对象的一部分还是测试的一部分?我认为这些等待应该是页面对象的一部分。例如,如果页面包含内容由ajax调用加载的组件,则在加载之前,您的测试应该获得对该组件的引用。例如,TableComponent tc=page.getResultable。这也意味着您需要页面和组件中的web驱动程序。通常我使用LoadableComponent来实现页面和页面上的组件:感谢Rene的宝贵反馈谢谢你的评论。所以,既然我们在使用页面工厂时没有在LoginPage或任何页面对象中使用驱动程序实例,那么我们在哪里编写自定义等待等或任何涉及驱动程序对象的操作呢?这些等待应该是页面对象的一部分还是我的测试的一部分?谢谢你的评论。所以,既然我们在使用页面工厂时没有在LoginPage或任何页面对象中使用驱动程序实例,那么我们在哪里编写自定义等待等或任何涉及驱动程序对象的操作呢?这些等待应该是页面对象的一部分还是我的测试的一部分?