[自动化测试]PO模式实现Selenium自动化测试

文章介绍了Selenium框架下的PageObject(PO)模式,包括两种方案的对比,重点讲解了方案二的实现,涉及元素对象层(定位元素)、元素操作层(元素操作)和页面业务场景层的结构分析。此外,还讨论了测试用例的设计和测试报告的生成,提供了一个完整的自动化测试流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是PO模式

根据之前的笔记可以了解到PO设计模式有两种方案,方案如下

PO模式指将页面元素的定位即元素的操作分离 PO方案一
第一层:将所有元素对象定位器放到一个文件,不进行定位
第二层:将所有元素操作放到一个文件,先定位再操作
第三层:将公共的业务场景封装到一个文件中
PO方案二
元素对象层:封装定位元素的方法
元素操作层:借助元素对象层封装元素的操作方法
页面业务场景层:借助元素操作层封装页面的业务场景

很明显两种方案中,第二种更方便,且需要维护的文件更少些,因此使用第二种方法来实现PO模式Selenium框架

代码实践

上面了解了PO模式,下面来看看PO模式是怎么实现的。

PO模式结构分析

在写代码之前,我们需要先看下如何开始写代码,也就是需求有了,下面要将需求一步一步拆分到实现。从PO模式上看,是需要分3层的,即元素对象层、元素操作层和页面业务场景层,因此我们的代码也要分为3层,这样方便区分查找。

元素对象层分析

元素对象层,该层用于封装定位元素的方法。什么意思呢?说白了就是看页面中有没有这个元素,在Selenium中查找并定位元素是非常关键的一步,若定位不到元素,后面所有操作都无法进行。提到定位元素,就不得不提Web开发,Web开发主要包括HTML、CSS、JavaScript等,而定位元素就是在HTML中查找构成HTML的元素,[XJY]零基础入门学习Web开发(HTML5&CSS3)笔记中讲了HTML和CSS的相关开发内容,可进行详细了解。
了解了HTML、CSS技术后,我们可以知道要想定位页面中的元素,可通过id、name、class、tag、link、plink、xpath、css几种方式来定位,因此我们这第一层的元素对象就通过以上几种方式对元素进行定位,在编写代码前,我们还需要思考两个问题:

  • selenium中使用什么方法定位元素
  • 根据Web的工作方式,元素并非一下全部加载出来,我们如何处理这个等待时间
    我们先看一个问题,在selenium中可以定位元素的方法见Python实现Web UI自动化测试实战读书笔记(四)中的笔记。
    这样以上两个问题都解决了,我们就可以实现元素的定位了,由于不同元素的定位方法不用,而且后面随着技术的更新版本的迭代,元素定位方法还可能改变,因此为了方便后面的维护,可以将find_element('locator','value')进行封装,放到Base类中,在后面页面定位元素时,直接调用封装的方法即可,实现代码的低耦合。
    元素定位问题解决了,再看等待时间的问题。我们知道Web访问时,是浏览器向服务器请求文件,然后浏览器再将文件解析渲染出来的,因此我们需要等待元素的渲染,这就需要用到selenium中的显性等待,下面是对显性等待的方法说明。
WebDriverWait类,用来定义超时时间、轮询频率等
	参数:必传driver和timeout(决定最多轮询多少秒),可选poll_frequency设置轮询频率,可选ignored_exceptions设置需要忽略的异常
	方法:until(可执行方法, 超时返回的信息)指定轮询时间内每隔一个轮询频率调用一下method方法,直到返回值不为False;until_not(可执行方法, 超时返回的信息)指定轮询时间内每隔一个轮询频率调用一下method方法,直到返回值为False;until和until_not超时抛出TimeoutException异常
	语法格式:WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时返回的信息) 
expected_conditions模块方法   
	导入模块 from selenium.webdriver.support import expected_conditions as EC   
	该模块提供丰富的预定义等待条件,详细可见书P228页   
	支持自定义等待条件:`ele = WebDriverWait(driver, 10).until(lambda x:x.find_element_by_id('kw'))`

通过以上分析,元素对象层的功能基本就可以实现了,这里需要注意的是,不同页面定位元素的方法可能不同,因此需要不同页面建立一个类,在类中实现该页面中不同元素的定位即可。举个例子,比如我们要查找登录页面的用户名和密码,则我们需要先确定用户名和密码输入框要通过什么定位器定位,定位器定位的内容是什么,确定好后,就新建一个登录类,类中的方法实现用户名和密码元素的定位,定位时调用我们上面封装好的元素定位方法查找元素即可,到此,元素对象层的功能就实现好了。

元素操作层分析

元素操作层是借助元素对象层定位到的元素,实现页面元素的操作,例如输入用户名、输入密码等,和元素对象层一样,也需要一个页面一个类,类中实现操作方法,每个方法要操作的元素都来自于元素对象层定位的元素。

页面业务场景层分析

页面业务场景层是实现页面的业务场景,还是登录页面的例子,比如成功登录页面、不输入用户名登录、不输入密码登录等业务。同样也是一个页面一个类,类中实现业务场景的方法,即要实现登录页面需要哪些操作的集合,这些操作直接从元素操作层获取即可。

其他内容

到此,我们对PO模式的分析就完成了,但是实现了这些,还不足以实现自动化测试,我们还需要设计测试用例。

测试用例

测试时肯定要指定测试的URL地址,使用的浏览器等内容,这些我们可以放到一个配置文件中保存,这样如果有任何变化,直接修改配置文件即可,这样我们就需要一个读取配置文件的方法,为了方便调用也是给独立出来。
有了基础信息,就可以设计测试用例了(注意使用不同的测试框架,用例编写方式略有差别),按PO的模式,测试用例中就是指定要执行哪些场景,获取哪些信息,比如不输入密码登录,需要调用页面业务场景层的不输入密码登录场景,执行后,还需要获取到提示信息,此时就需要分别在元素对象层、元素操作层添加提示信息元素的定位、获取内容的操作。
要想用例可以执行,还需要选择一个测试框架,目前有很多测试框架,比如unittest、pytest等等,根据不同的测试框架,编写不同的测试固件,设置不同的测试套件,并加断言,最后的结果测试框架会直接传递给测试报告。

测试报告

测试报告也有很多,比如HTMLTestRunner、pytest-html、Allure等等,选择好测试报告框架后,测试用例的执行结果会以页面的方式呈现出来。

至此自动化测试的内容就完全了,下面看看代码的实现。

实践代码

具体的代码实践可参见这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值