什么是 PO?

1.页面对象模型 (PO) 是一种设计模式,用来管理维护一组页面元素的对象库.

2.在 PO 下,应用程序的每一个页面都有一个对应的 Page 类.

3.每一个 Page 类维护着该页面的元素集和操作这些元素的方法.

PO 的好处?

1.代码可读性强

2.可维护性高

3.复用性高

怎么设计 PO?

设计的原则

1.抽象每一个页面

2.页面中元素不暴露,仅报错操作元素的方法

3.页面不应该有繁琐的继承关系

4.页面中不是所有元素都需要涉及到,核型业务元素做建模使用

5.把页面划分功能模块,在 Page 中实现这些功能方法

Appium 的 PageFactory 模式

我用的是java写的脚本,使用appium java-client 6.1.0

java版的appium自带了PO工厂模式

//首先导入pagefactory.AppiumFieldDecorator类
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import org.openqa.selenium.support.PageFactory;

//构造方法中传入driver参数
public FunctionPage(AppiumDriver<?> driver) {
        this.driver = driver;
        //使用initElements方法构造,第一个参数new AppiumFieldDecorator,第二个参数是当前类
        PageFactory.initElements(new AppiumFieldDecorator(driver), this);
    }

继承 FunctionPage 类

当然每个Page都可以构造AppiumFieldDecorator,但是这样显示是很麻烦.

所以在建立了一个FunctionPage类

1.负责构造AppiumFieldDecorator,子类继承即可.

2.可以封装常用操作,子类调用即可

public class BuyPage extends FunctionPage{

    public AudioPage audioPage;
    private static final int Timeout = 5;
    private static final String play = "播放";
    @iOSFindBy( accessibility = "已购区")
    @WithTimeout(time = Timeout,chronoUnit = ChronoUnit.SECONDS)
    public IOSElement BuyArea;

    /**
     * 初始化页面
     */
    public BuyPage(IOSDriver iosDriver) {
        super(iosDriver);
        //在子类构造的时候,调用FunctionPage
        audioPage = new AudioPage(iosDriver);
    }
    }

    **
     * 听书借阅区
     */
    public void borrowArea() throws InterruptedException {
        BorrowArea.click();
        log_info("听书借阅区");
        BorrowList.click();
        log_info("听书借阅区列表");
        //调用FunctionPage中封装的断言方法
        assertContain(play);
        audioPage.Audioplay();
    }

总结以上代码:

1.PO 建模交给父类,子类 Page 继承调用即可

2.父类负责封装常用方法,子类 Page 继承调用即可

3.这样做的好处,让 Page 页面更简洁,公共部分的方法使用更高效

测试类使用 PO

1.对于测试类,不应该有直接操作元素的方法.测试步骤是使用每个Page中方法来完成一条测试用例

2.page页面提供对外的方法,测试用例调用.让测试类更简洁、维护成本相对较少.


/**
* 测试点:首页-电子书列表-新书上架
*/
@Test
public void  test_newBookList() throws InterruptedException {
    homePage.homeeBook();
    eBookPage.newBookList();
}



↙↙↙阅读原文可查看相关链接,并与作者交流