1.页面对象模型 (PO) 是一种设计模式,用来管理维护一组页面元素的对象库.
2.在 PO 下,应用程序的每一个页面都有一个对应的 Page 类.
3.每一个 Page 类维护着该页面的元素集和操作这些元素的方法.
1.代码可读性强
2.可维护性高
3.复用性高
1.抽象每一个页面
2.页面中元素不暴露,仅报错操作元素的方法
3.页面不应该有繁琐的继承关系
4.页面中不是所有元素都需要涉及到,核型业务元素做建模使用
5.把页面划分功能模块,在 Page 中实现这些功能方法
我用的是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);
}
当然每个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 页面更简洁,公共部分的方法使用更高效
1.对于测试类,不应该有直接操作元素的方法.测试步骤是使用每个Page中方法来完成一条测试用例
2.page页面提供对外的方法,测试用例调用.让测试类更简洁、维护成本相对较少.
/**
* 测试点:首页-电子书列表-新书上架
*/
@Test
public void test_newBookList() throws InterruptedException {
homePage.homeeBook();
eBookPage.newBookList();
}