Skip to content

自定义元素

为了方便的操作元素,框架实现了一些自定义的HTML元素,来方便操作. 同时每一个自定义元素都有一个默认的操作, 默认的操作基本可以满足一般性的需求. 总体上我们可以给这些元素操作分个类:

  • 基本元素

    • Link
    • Button
    • InputBox
    • CheckBox
    • Radio
    • Image
    • SelectList
    • Table
  • 定制的HTML元素

    • UploadElement
    • TreeElement
    • DatePicker
    • TagElement
    • DropDownElement
    • CheckBoxContainerElement
  • 特殊的操作

    • WebTestActionBuilder.CLOSE_POPUP
    • WebTestActionBuilder.CLOSE_TAB
    • WebTestActionBuilder.SWITCH_TAB
    • WebTestActionBuilder.WAIT_LOAD
    • WebTestActionBuilder.SCROLL_TO_BOTTOM
  • 自定义组合操作

    • 自己编写自定义元素
    • Page类中编写元素组合操作

基本元素

基本元素操作比较容易理解,这些就是不同的标准HTML元素,一般都使用默认的HTML元素操作就可以了,默认操作如下:

元素 默认操作
CheckBox selectByVisibleText
Radio selectByVisibleText
selectList selectByVisibleText
InputBox inputIfPresent
|Others clickIfPresent

方法名后面有IfPresent的都表示如果元素存在就点击,如果不存在就跳过,跳过的过程都有重试的动作,速度可能较慢

其他方法可能也会常用,如InputBox 的inputAndSelect,针对的是输入内容然后在选择选项

@UIAction(processName = "editCustomerVisitMemo",
           elementActionDescription = {
                   "watchType",
                   "managerWithSee",
                   "confirmStatus", "startAt",
                   "startHour", "startMinute", "estateName inputAndSelect", "buildingName inputAndSelect"
                   , "roomNo inputAndSelect", "newHouseName inputAndSelect",
                   "inquiryReply", "saveVisitMemo"})

如何使用这些元素,步骤如下: - PageObject 定义元素 - 编写业务流程,指定元素和动作

样例代码:

@UIActions(actions={@UIAction(processName="addCustomer",
        elementActionDescription={"flagPrivate","status",
                "inquirySource","addsourceOther","addSource","custGrade",
                "custName","custTel","tags","remark input","submit"}),
        @UIAction(processName="addCustomerTag",
                elementActionDescription={"addTag","customLabel","submitTag"
                        })
})

public class AddCustomerPage extends ExecutablePageObject {

    @FindBy(linkText="添加联系人")
    @ElementName(elementName = "添加联系人")
    private Button addCustomer;

    @FindBy(xpath = "//a[@ng-click='addLabel()']")
    @ElementName(elementName = "添加联系人")
    private Button submitTag;

    @FindBy(xpath="//button[@ng-click='submit()']")
    @ElementName(elementName = "提交")
    private Button submit;

    @FindBy(xpath="//input[@name='flagPrivate']")
    @ElementName(elementName="录入类型")
    private Radio flagPrivate;

    @FindBy(xpath="//input[@name='status']")
    @ElementName(elementName="状态")
    private Radio status;
    @FindBy(xpath="//input[@name='inquirySource']")
    @ElementName(elementName="inquirySource")
    private Radio inquirySource;
    ......
  }

UIAction中: 例如: addCustomer 这个元素是Button 类型,所以默认动作就是clickIfPresent,所以在执行过程中,程序会点击这个按钮,而不需要自己写findElement(By).click()这样的代码

执行addCustomer业务的代码如下,多个页面同时都有这个ProcessName: addCustomer的都可以直接运行

WebTestActionBuilder.execute(Lists.newArrayList(MyCustomerSearchPage.class,
       AddCustomerPage.class, CustomerNeedsPage.class)
       , "addCustomer", driver, testData);

额外需要说明的是: CheckBox,Radio这样的元素如果是同一个类型的选项,只需要定义一个元素,如inquirySource,它可能有很多选项,但是在页面元素中只需要定义一个Radio元素,执行时具体选择什么样的元素有inquirySource的数据决定

定制的HTML元素

  • UploadElement: 文件上传,定位到<input type="file">类型的HTML元素,默认操作为上传文件
  • TreeElement: 主要为组织架构树的选择项,默认操作为select,输入的数据为: orgId1-orgID2-...-
  • DatePicker: 时间选择,输入数据格式为YYYY-MM-DD
  • TagElement: Tag元素的选择
  • DropDownElement: 有些按钮需要先点击一下,然后选择下拉菜单的某个元素
  • CheckBoxContainerElement: 需要点击一下,然后再选择CheckBox

特殊的操作

  • WebTestActionBuilder.CLOSE_POPUP: 关闭弹出框
  • WebTestActionBuilder.CLOSE_TAB: 关闭Tab
  • WebTestActionBuilder.SWITCH_TAB: 切换Tab
  • WebTestActionBuilder.WAIT_LOAD: 等待
  • WebTestActionBuilder.SCROLL_TO_BOTTOM: 滚动到页面底部

使用的代码示例:

@UIAction(processName = "editCustomerVisitMemo",
           elementActionDescription = {
                   "watchType",
                   WebTestActionBuilder.SWITCH_TAB,
                   "inquiryReply", "saveVisitMemo"})

自定义组合操作

  • 自己编写自定元元素
  • Page类中编写元素组合操作

自定义组合操作: 自己编写自定元元素

每个项目组可以根据不同的情况,自己实现自定义的HTML组件,实现方法很简单,只用继承HTMLElement类就可以了,然后自己实现方法

public class NewButton extends HtmlElement {
  public NewButton(String name, WebElement element) {
      super(name, element);
  }

  public NewButton(WebElement element) {
      super(element);
  }

  public void clickById(String id) {
      List elements = DriverFactory.get().findElements(super.getBy());
      WebElement element = (WebElement)CollectionsHelper.filter(elements, (webElement) -> {
          return id.equals(webElement.getAttribute("id"));
      });
      element.click();
  }
}

在Page类里面定义元素成这个新建的元素类型,然后clickById就在UIAction里面用了name clickById

自定义组合操作: Page类中编写元素组合操作

可以在Page类里面自己编写元素组合的操作,比如:

  public void dailyReportData(String dailyReportData){
    this.diilyReportElement.input(dailyReportData);
    this.diilyReportElement2.input(dailyReportData);
    this.diilyReportElement3.input(dailyReportData);
  }

然后dailyReportData这个名字也可以在UIAction中使用了,同时他输入的数据会和TestData里面的dailyReportData相对应.

List 类型的元素处理

@UIAction(processName = "editCustomerVisitMemo",
           elementActionDescription = {
                   "type",
                   WebTestActionBuilder.SWITCH_TAB,
                   "inquiryReply", "saveVisitMemo"})

private List<Link> type;

TestData:

Header Value
TestData.type[0] abcds