selenium --- 电子商务产品实战进阶

产品分析

功能:
1、登录
2、进入到商品管理,对商品列表进行新增和删除

测试用例分析

  • 测试用例-新增类目
    1、用户登录
    2、点击首页按钮,进入商品管理->商品列表菜单
    3、点击添加
    4、创建商品类目
    5、获取操作结果
    6、断言测试结果

  • UML图分析

1、灰色方块在po模式中代表一个页面(即一个类,class),方块中的文字代表每个页面的名称(即类名,class名);

2、虚线代表每个页面中能实现的功能(即类中能提供的方法);

3、 箭头的起始端,表示页面功能(即方法)所在页面(即类,class);
箭头上的文字代表功能名称(即方法名称);
箭头的末端表示将跳转到哪个页面(即访问到哪个类class),或者表示页面的返回数据(即类的返回值);

对测试步骤进行PageObject建模

  • 传统的线性脚本
    传统的线性脚本存在大量样板代码(findelement,click等),不能清晰表达业务场景;不能清晰的根据元素完整识别测试过程;不能根据测试场景的修改,灵活修改测试用例代码,不能增强代码的可维护性。

  • PO模式(页面对象模型)设计思想
    将浏览器中的一个页面抽象成一个类;
    将页面中的元素抽象成类的属性;
    将页面中所提供的功能抽象成类的方法;
    将页面的细节封装到公共方法中;

image

  • PO模式设计原则
    1、不要暴露页面内部的元素给外部(即类中的属性最好是用私有属性表示,不能随便被外部访问到);
    2、不需要建模UI内的所有元素(即并不是所有页面元素都需要建模,具体情况具体分析,这里视频讲得有点水,对新手不太友好,需要自己去实践);
    3、要用公共方法代表UI(即页面)所提供的功能;
    4、同样的行为不同的结果可以建模为不同的方法(比如登录功能有两种不同结果:登录成功、登录失败,此时需要根据结果设计为两种不同的方法);
    5、方法应该返回其他的 PageObject(方便链式调用), 或者返回用于断言的数据(方便断言);
    6、不要在方法内加断言;

  • PO模式改造

编写PO测试脚本

1、 根据UML时序图梳理测试用例(梳理业务操作流程,根据业务流程编写测试用例,根据测试用例创建主调类,前置后置函数和主调函数,编写注释)

image

2、 根据UML时序图构造PO模型(类、类属性、方法)

3、 根据UML时序图创建页面类,定义页面方法,注释,先不用写具体细节

4、 根据UML时序图编写链式调用(即类的调用)
4.1、先根据UML时序图编写类的返回值
编写类的返回值时应注意的事项;

4.2、创建好主调类以及主调函数,将各个封装的PageObject注释,添加到对应的被调函数中;

4.3、根据UML时序图,设计每个类与类之间的调用,实现链式调用


遇到的坑一:
在使用链式调用时,类中方法return 的对象是一个ClassName() ,而不是ClassName:

区别在于return ClassName() 返回的是一个实例化后的类对象,return ClassName 返回的是一个已经存在的类 或者 变量,该类中没有__init__构造方法,因此只能通过return ClassName() 实例化类。

4.4、在主调类中的setup_clas函数和主调函数中调用封装好的PageObject类和类中的方法;


4.5、运行脚本,保证脚本能调通。

5、封装BasePage( 即封装driver对象,常用的方法:find_element()、find_elements()、send_keys()、quit()等 )



5.1、将每个网页页面继承BasePage,并在类中调用相关的方法,且返回实例类时,需要带上self.driver参数


5.2、运行脚本,保证脚本能调通。

6、实现每个页面方法(业务具体实现)


6.1、运行脚本,保证脚本能调通。

7、封装页面元素
7.1、使用类属性封装页面元素节点
把页面元素提取出来,通过定义类属性的方式,放到每个页面类的前面:

7.2、 将自定义的显示等待条件封装到BasePage类中

PO测试脚本的优化

测试断言、数据清理、参数化、添加日志、测试报告等
image

删除功能和新增功能封装流程相似,在已经搭建好的商品列表页面,新增一个delete方法,封装好相关属性即可。