65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 Page Factory 的 Selenium 自动化框架

2015年7月5日

CPOL

5分钟阅读

viewsIcon

52651

downloadIcon

583

基于 Page Factory 的 Selenium 自动化框架及其架构。

引言

我们都听说过 POM(Page Object Model)。本文将介绍“Page Factory”及其在 Selenium 中使用 Java 的实现。

Page Factory 是 Selenium WebDriver 的内置页面对象模型概念,但它经过了高度优化。

背景

Page Factory 可用于任何类型的框架,如数据驱动、模块化或关键字驱动。Page Factory 更侧重于代码的结构化方式,以获得最佳效益。

Page Factory 的优点

  1. 每当我们使用 `WebElement` 时,它都会重新查找它,因此您不应该会遇到 `StaleElementException`。
  2. 在 `PageFactory` 初始化时,代理已配置,但 `WebElement` 尚未查找。因此,我们不会遇到 `NoSuchElementException`。

我们将进一步了解如何初始化 Page Factory。

架构

任何框架结构都依赖于不同的组件,在这里我们将详细了解 Page Factory 自动化架构。

架构设计

架构组件

测试类

在测试类中,我们将编写实际的 Selenium 测试脚本。在这里,我们调用页面操作并描述要在 Web 页面上执行的操作。为了更好的代码可读性,每个页面都可以编写自己的测试类。我们可以在 `@Test` 注释中编写测试用例。

页面操作类

在页面操作类中,我们可以根据页面和功能编写所有 Web 页面的操作。在页面操作组件下,应用程序的每个页面都有一个对应的 `Page` 类。

页面操作类会调用 Page Factory 类,Page Factory 返回 Web 页面的 `WebElement`,页面操作类拥有执行这些 `WebElement` 操作的页面方法。

要跳转到其他页面操作类来调用任何可重用的页面操作方法,非常容易。

Page Factory 类

Page Factory 类本质上就是对象仓库。对于每个 Web 页面,它都有自己的页面对象定义。每个 Web 元素都应唯一标识并应在类级别定义。我们将使用 `FindBy` 注释并定义 Web 元素,以便能够对其执行操作。

报告/数据库连接类

在这里,我们可以编写自己的业务层、报告结构、`DBConnection` 等。这个组件通常由页面操作类中的页面操作方法调用。

所需环境

  1. Java
  2. Eclipse IDE
  3. Selenium WebDriver
  4. TestNG

Eclipse IDE -- 它是 Java 的集成开发环境。

Selenium WebDriver -- Selenium 是一个开源测试框架。Selenium WebDriver 支持大多数编程语言,如 C#、Java、Perl、Python 等。

TestNG -- 这是一个受 Junit 启发的测试框架。我们在 TestNG 中扩展了新的注释。

框架

详细的框架结构

自动化项目

假设我们正在处理多个项目/模块,并且需要自动化这些模块,那么在这个源文件夹中,我们列出了不同的项目/模块。

通过这种方式,可以轻松地为特定项目/模块创建自己的测试套件。我们可以编写自己的初始化脚本来加载与任何特定模块/项目相关的所有组件。在上面,您看到了 Google/Gmail 项目的 `Automation.Project.Google`。您可以在此处添加自己的项目。

自动化框架

在自动化框架源文件夹中,我们添加了 `Browser`、`WebElement`、`Component` 函数以及我们在框架后续工作中使用的其他通用函数。

自动化 Page Factory

自动化 Page Factory 源文件夹,其中我们根据模块/项目拥有所有对象仓库。在上面的示例中,您可以看到 Google 项目的 _PageObject.Login.java_。我们可以在 Google 项目下为每个 Web 页面定义更多的页面对象。

以下是定义 Page Factory 的代码片段

   package automation.PageFactory.Google;
   import org.openqa.selenium.WebDriver;
   import org.openqa.selenium.WebElement;
   import org.openqa.selenium.support.FindBy;
   import org.openqa.selenium.support.PageFactory;
   public class PageObjects_Login 
   {
       Code Here
   }

要编写 Page Factory 代码,我们需要导入 `org.openqa.selenium.support.PageFactory;`,它允许我们使用 Page Factory 的实现。

您可以通过利用“`this`”关键字来引用当前类实例,在 `PageObject` (PO) 的构造函数中初始化元素,如下所示:

   import org.openqa.selenium.support.PageFactory;
   public PageObjects_Login(WebDriver driver)
   {
       this.driver = driver;
       //This initElements method will create all WebElements
       PageFactory.initElements(driver, this);
   }

此外,借助 `PageFactory` 类,我们使用 `@FindBy` 注释来查找 `WebElement`。`@FindBy` 可以接受 `partialLinkText`、`name`、`xpath`、`tagName`、`id`、`linkText`、`css`、`className` 作为属性。

以下是 `@FindBy` 的代码片段

   @FindBy(xpath=".//*[@id='Email']") 
    public WebElement gmailUserIDWebEdit;
 
    @FindBy(id="next")
    public WebElement gmailNextButton;
    
    @FindBy(id="Passwd")
    public WebElement gmailPasswordWebEdit;

始终为任何 `WebElements` 使用有意义的名称。

自动化页面操作

页面操作包含我们所有的 Page Factory 调用和页面操作方法。我们为每个 Web 页面都有单独的页面操作,用于代码重用。

在这里,我们通过创建 Page Factory 类的实例来调用相应的 Page Factory `WebElements`。

    package automation.PageActions.Google;
    import java.util.NoSuchElementException;
    
    import automation.PageFactory.Google.PageObjects_Login;
    import org.openqa.selenium.WebDriver;
    
    public class PageActions_Login 
    {	
    	WebDriver driver;
    	PageObjects_Login po; // Create Instance to Page Factory class
    	public PageActions_Login(WebDriver driver)
    	{
    		this.driver = driver; // set webDriver for current Page Action
    	}
	}

在上面的代码片段中,在页面操作类的构造函数中,我们为主当前的页面操作设置了 `WebDriver`。

我们可以编写自定义页面操作方法来对 Web 元素执行操作。

以下是针对 Gmail 网站输入 `UserID` 的代码片段。

    public void enterPassword(String searchText){
		po = new PageObjects_Login(driver);
		if (po.gmailPasswordWebEdit != null){
			try 
			{
				po.gmailPasswordWebEdit.sendKeys(searchText);
			} catch (NoSuchElementException e) {
				// TODO Auto-generated catch block
				System.out.println("Exception message"+ e.getMessage());
			}
		}
	}

自动化测试

在自动化测试源文件夹中,我们有包含 `TestNG` 测试用例的 `Test` 类。

在这里,我们创建 Page Action 的实例并调用 Page Action 方法。我们只需要将 `WebDriver` 实例传递给 Page Action。

    public class Test_Login {
	
	WebDriver driver;
	PageActions_Login actionLogin; 
	
	@BeforeTest
	public void setup(){
		driver = new FirefoxDriver();
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
		driver.get("http://gmail.com/");
	}
  @Test (priority =0)// Try to sign with Invalid Password 
  public void SignIntoGMailInvalidPassword() {
	  actionLogin = new PageActions_Login(driver);
	  actionLogin.enterUserIDPassword("upadhyay40","xyz");
	  String loginPageTitle = actionLogin.getWrongPasswordTextMessage();
	  Assert.assertTrue(loginPageTitle.contains
	  ("The email and password you entered don't match."));
  }

在此,我们使用 `@Test` 注释创建 `TestNG` 测试用例,并在测试方法中调用 Page Action 方法。

自动化报告

在这里,我们编写了自定义报告,以便在测试运行后有更好的理解。

在失败案例截图中,在任何测试用例失败后,它会记录带有屏幕截图的结果。

在图形报告中,我们可以使用 `ReportNG`、`Velocity` 和 `TestNG` 的指南插件。

实现了 `ITestListener` 接口的实现在设计上用于实时报告,而实现了 `IReporter` 接口的实现在套件运行完成后用于生成报告。

实现 `IReporter` 的实例和 `generateReport(List<ISuite> suites, String outputDirectory)` 方法应该允许您查看测试结果并创建 HTML 报告。

自动化业务层

所有主要的逻辑操作都在自动化业务层中进行处理。协调来自用户界面的输入和来自数据库的数据,自动化业务层在任何软件应用程序中都占有重要地位。

© . All rights reserved.