Skip to content

构建业务流程的方法

之前已经介绍了关于框架的设计思路,已经一些基本的用法,主要包括了:

  • Page 类(Page Object), 这里需要大家了解的是如何定位页面元素(id,name,css,xpath) 但是实际上都有统一的逻辑的,就是使用一个标示符号来表示元素的定位,这里需要大家了解的是xpath
  • Page 类定义过程中需要了解的是不同HTML元素的种类
  • 测试数据类

以下介绍一下在Page类和测试数据类定义好了之后,构建测试业务流程的一些方式.

构建测试流程- 手动构建

selenium提供了很多的方法可以操作页面的元素,所以如果通过selenium自己的接口的话,直接可以使用类似于如下的代码构建:

  driver.findElement(By.id("username")).sendkeys("username")
  driver.findElement(By.id("loginButton")).click()

目前我们通过这个方式写也是支持的,不过我们希望这些业务代码需要在flow的一个类里面,来统一管理. 同时如果我们目前已经定义了页面的类,PAGE类的话,可以通过一下代码来表示:

  Page page = ModifiedPageFactory.createPageObject(driver,Page.class);
  page.getUserName().sendKeys("userName");
  page.getLoginButton().click();

相应的流程类:

  public class LoginFlows{
    public static void login(String userName,String password,WebDriver driver){
      Page page = ModifiedPageFactory.createPageObject(driver,Page.class);
      page.getUserName().sendKeys(userName);
      page.getPassword().sendKeys(password);
      page.getLoginButton().click();
    }

    public static void login(WebDriver driver, TestData data){
      Page page = ModifiedPageFactory.createPageObject(driver,Page.class);
      page.getUserName().sendKeys(data.get("userName"));
      page.getPassword().sendKeys(data.get("password"));
      page.getLoginButton().click();
    }
  }

构建测试流程- 使用WebBaseTest类

使用WebBaseTest类暂时不推荐这样做,这个是一开始的一个遗留类,不过不影响具体的使用.可以直接使用WebTestActionBuilde来构建.

实例代码:

public class LoginWebFlow extends BaseWebTestAction {

    public LoginWebFlow(WebDriver driver, TestData testData) {
        super(driver, testData);
    }

    @Override
    public void execute() {
        driver.get(EnvironmentHelper.getDomainUrl());
        Page page = ModifiedPageFactory.createPageObject(driver,Page.class);
        page.getUserName().sendKeys(data.get("userName"));
        page.getPassword().sendKeys(data.get("password"));
        page.getLoginButton().click();
    }
}

构建测试流程- 使用WebTestActionBuilder

在上面的例子中我们可以看到:

Page page = ModifiedPageFactory.createPageObject(driver,Page.class);
page.getUserName().sendKeys(data.get("userName"));
page.getPassword().sendKeys(data.get("password"));
page.getLoginButton().click();

如果使用WebTestActionBuilder的话,以上代码就和如下例子是一致的:

  WebTestActionBuilder.use(Page.class,driver)
  .process(Lists.newArrayList("userName inputIfPresent",
  "password inputIfPresent","loginButton click"),data);

  //可以简写为:
  WebTestActionBuilder.use(Page.class,driver)
  .process(Lists.newArrayList("userName",
  "password","loginButton"),data);

  //如果在Page里面定义了注解
  @UIActions(
    actions = {
            @UIAction(processName = "登陆",
                    elementActionDescription = {"userCode input"
                            ,"password input"
                            ,"companyId selectIfPresent"
                            ,"submit click"})
    }
  public class Page extends ExecutblePageObject{
    ..........
  }  
)

//WebTestActionBuilder 使用:

WebTestActionBuilder.use(Page.class,driver).process()
              "登陆", testData);

了解了WebTestActionBuilder的基本用法之后,我们定义一个LoginFLow可以使用如下代码:

public class LoginFlows{
  public static void login(String userName,String password,WebDriver driver){
    driver.get(EnvironmentHelper.getDomainUrl);
    //WebDriverHelper.get(driver,EnvironmentHelper.getDomainUrl);
    WebTestActionBuilder.use(Page.class,driver).process()
                  "登陆", testData);
  }
}

构建测试流程- 使用WebTestActionBuilder中常用函数的用法

  • execute(List pages,String uiAnnotationName,WebDriver driver, TestData data): 根据注解名字执行多个页面的操作,前提是多个页面中具有相同的UIAction名称
  WebTestActionBuilder.execute(Lists.newArrayList(Page1.class,Page2.class))
                "登陆", driver,testData);
  • executeUIAction(T page, String uiAnnotationName , TestData data): 根据注解名字执行一个页面的操作,前提是多个页面中具有相同的UIAction名称
  WebTestActionBuilder.executeUIAction(Page.class,
                "登陆", driver,testData);
  • executeUIAction(T page, List elementActionPairList , TestData data): 根据描述执行描述中的操作
WebTestActionBuilder.executeUIAction(pageInstance,Lists.newArrayList("userName",
"password","loginButton"),driver,data);
  • createTestActionByUIAction 的一系列函数和以上的函数类似,可以直接使用executeUIAction的一系列函数替代的 不过他返回的是一个TestAction对象,如果要让TestAction对象里面的内容跑起来,只有后面加execute()方法就可以了
  WebTestActionBuilder.createTestActionByUIAction(ageInstance,Lists.newArrayList("userName",
  "password","loginButton"),driver,data).execute();

那么什么时候或许能用到这个createTestActionByUIAction呢,可能的场景是:


  List<TestAction> steps = Lists.newArrayList();
  stpes.add(WebTestActionBuilde.createTestActionByUIAction(Login.class,"abcAnnotation",driver,data))
  steps.add(WebTestActionBuilde.createTestActionByUIAction(Login.class,"efGAnnotation",driver,data)))
  steps.add(WebTestActionBuilde.createTestActionByUIAction(Login.class,"HILAnnotation",driver,data)))

  for(step : steps){
    step.execute()
  }

构建测试用例的DataProvider的说明

@DataProvider(name = "search_data")
public Iterator<Object[]> getTestData(Method m) throws Exception{
    Map<String, Class> clazzMap = new HashMap<String, Class>();
    clazzMap.put("SearchData", BaiduSearchData.class);
    clazzMap.put("TestDescription", TestDescription.class);
    Iterator<Object[]> y = TestDescription.filterByMethod("testcase/flows/BaiduSearchTestCases.xls", m, clazzMap);
    return y;
}
  • SearchData 是定义一个前缀,已这个开始的excel字段值都会到BaiduSearchData类的相对应的值里面
  • TestDescription 同样道理