我是学习硒Webdriver的初学者。我无法理解页面对象和工厂模型的工作方式,以及如何受益?


请帮我详细解释。

评论

您可能还需要检查一下:sqa.stackexchange.com/questions/3798/…

另请参见sqa.stackexchange.com/a/15557/8992

在设计页面对象时遵循单一职责原则-您将拥有易于阅读和可靠的测试-更多信息:testautomationguru.com/arquillian-graphene-page-fragments

#1 楼

PageObjects

自动化测试用例的代码应该易于理解,而不是太复杂。如果测试失败,我们想尽快知道原因和原因。为此,存在PageObjects。 PageObjects是包含WebElement以及与之关联的每个动作的类。

PageObject看起来像这样: br />
class HomePage {

    WebDriver driver;

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

    // Find a single element
    @FindBy(id="home-menu-entry")
    WebElement homeMenuEntry;

    public void clickHomeMenuEntry() {
        homeMenuEntry.click();
    }

    // Find several elements
    @FindBy(className="menu-entry")
    List<WebElement> menuEntries;

   // More actions and elements
}


还可以将PageFactory.initElements();放入构造函数中,并创建一个HomePage对象,而不用调用PageFactory方法。调用initElements(),所有元素都将被初始化,如果使用它们,则不会稍后。

如何组织此元素? 。但是页面的某些组件存在于许多页面上。对于这种情况,我为每个组件创建其他类。示例:


Header.class
Footer.class
HomePage.class
ContactPage.class

有用的链接


https://github.com/SeleniumHQ/selenium/wiki/PageFactory
https://github.com/SeleniumHQ/selenium/wiki/PageObjects
https: //github.com/SeleniumHQ/selenium/wiki/Design-Patterns


评论


对于POM,组成或继承在哪里?如果要处理片段,那么如何实例化和初始化Header和Footer?

– Thufir
18/12/28在14:37

@Thufir我不知道此问题是否有一个正确答案,因为它取决于上下文。您有两个选择:直接在测试中,例如“普通”页面对象或作为其他页面对象的一部分。我认为这取决于您在测试中使用这些组件的数量。

– Twaldigas
19年1月7日,9:56

#2 楼

页面工厂模式就像页面对象模型的扩展,但是页面工厂是增强的模型。首先,我们只需要导入包org.openqa.selenium.support.PageFactory

“工厂类可用于使使用Page Objects变得更容易”。

我们使用Page Factory模式进行初始化在页面对象中定义的Web元素。我们应该使用PageFactory类中的initElements()方法初始化页面对象,如下所示,一旦调用initElements()方法,所有元素都将被初始化。 PageFactory.initElements()静态方法采用给定类和类类型的驱动程序实例,并返回其字段完全初始化的Page Object。

public HompePage(WebDriver driver) 
{           
   this.driver = driver; 
   PageFactory.initElements(driver, this);
}


现在出现了为什么我们使用的问题构造函数?解决方案是=>
我们最好使用一个构造函数,该构造函数将WebDriver实例作为其唯一参数,或者使用无参数构造函数。如果无法实例化该类,则会引发异常。
Page Factory将基于定义的“定位符”,使用对实际网页上相应元素的引用来初始化每个WebElement变量。

使用简单POM检查以下代码

public class BasePage 
{
private By username = By.id("username");
private By password = By.id("password");
private By loginBtn = By.name("loginbtn");

   public void userLogin(String userName, String password) 
   {
        driver.findElement(username).sendKeys("testuser");
        driver.findElement(password).sendKeys("testpassword");
        driver.findElement(loginBtn).click();
   }
}


通过使用Page Factory:

public class BasePage {
  @FindBy(id= "username") private WebElement userName;
  @FindBy(id= "password") private WebElement password;
  @FindBy(id= "login") private WebElement loginBtn;

  public void userLogin(String userName, String password) {
    userName.sendKeys(userName);
    password.sendKeys(password);
    loginBtn.click();
  }
}


评论


请不要用相同的答案回答两个问题。如果两个问题需要完全相同的答案,则它们很可能是彼此重复的。

–corsiKa♦
16年5月11日在16:24

使用PageFactory,仅初始化第一页吗?后续页面是否已初始化?

– Thufir
18/12/28在0:40

#3 楼

用简单的术语来说,页面对象的解释如下:
一个单独的类(每页)列出了页面中的所有对象,并可以创建它们可以执行的允许操作。并且,每当需要在Web应用程序中的特定页面上执行任何测试时,都编写测试以首先导入页面,然后在该页面上执行所有允许的功能以执行测试。实际上,对页面及其对象和可以在每个对象上执行的操作都有清晰的定义,并且将使用这些方法的测试分开。查看页面对象类的任何人都将能够知道该页面上驻留了哪些对象以及每个对象可以执行哪些操作。
从事合同或项目新工作的测试自动化工程师只需要知道页面对象类的位置,并且无需进行大量培训即可帮助自动化测试。

希望这会使页面对象更加清晰。

#4 楼

页面对象是一种众所周知的设计模式,已被自动化工程师广泛接受,它为应用程序的每个页面创建单独的类文件,以将所有元素分组为属性,并将其行为/业务功能分组为该类的方法。但这可能并不总是一个好主意,尤其是当页面具有更多/不同的元素集/复杂元素(例如网格/日历小部件/ HTML表格等)时。

单个页面类中页面的元素,它变得太大而无法读取,维护等。该类可能包含太多职责要处理。应该将其重组并分解为较小的类。

我希望我的页面对象满足“单一职责负责人”的要求。

评论


请不要对多个问题发布相同的答案。另外,如果您要宣传产品或外部材料,则必须在创建的每个帖子中披露任何从属关系。此外,答案必须在没有外部材料/隶属关系的情况下回答问题。我不认为这符合该标准。

–corsiKa♦
16-09-21在19:44

@corsiKa,我没有在这里推广任何东西。我的答案似乎是在解决OP的问题以及已接受的答案。基本上,答案是在创建页面对象时遵循某些原则。

– Vinoth S
16-09-21在19:52

是的,这是一种宝贵的资源。如果不依赖石墨烯,它将是一种改进的资源,作为学习指南。从某种意义上说,它可以促进石墨烯的生长,这可能很棒。但是,确实可以。不过,这是一个很好的答案。并且,一个很好的链接。

– Thufir
18/12/28在15:16