Appium 浅谈 Appium 中的 PO 模式

xinxi · 2018年08月21日 · 最后由 恒温 回复于 2018年08月21日 · 3266 次阅读

什么是 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();
}


共收到 1 条回复 时间 点赞

图片里的是 PO 不是 POM 吧?

xinxi 记一次 Appium 实战 中提及了此贴 09月10日 14:17
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册