1、POM设计模式
——页面对象模型(Page object Modules),又名:PO/POM,是UI自动化最佳设计模式之一。把一个页面的测试用例,测试逻辑,封装为一个测试方法或者一个测试类(说白了,就是把如send_keys、click等方法封装一下,方便我们调用,后续不需要每次使用时在每次的写一遍)。
- 优点:
- 测试代码和页面的特定代码(如:定位符、布局)之间有清晰的区分(定位代码、行为代码)
- 页面提供的服务或操作只有一个存储库(如:类、py文件),不需要把服务分散到整个测试中,集中进行管理,开发或是测试修改时,只需要修改页面对象就可以了
import pytest
from selenium import webdriver
from time import sleep
class Test_Selenium():
#环境准备
@classmethod
def setup_class(cls):
cls.driver = webdriver.Chrome()#打开浏览器驱动,这样编写测试的时长会短,测试损耗的资源也会降低
def test_baidu_case01(self):
self.driver.get('http://www.baidu.com')
sleep(1)
self.driver.find_element_by_id('kw').send_keys('狗狗币')
self.driver.find_element_by_id('su').click()
sleep(1)
assert self.driver.title == "狗狗币_百度搜索" #根据进入的网页title做断言
def test_baidu_case02(self):
self.driver.get('http://www.baidu.com')
sleep(1)
self.driver.find_element('id','kw').send_keys('selenium')
self.driver.find_element('id','su').click()
sleep(6)
assert self.driver.title == "selenium_百度搜索" # 根据进入的网页title做断言
def test_baidu_case03(self):
self.driver.get('http://www.baidu.com')
sleep(2)
self.driver.find_element_by_id('kw').send_keys('pytest')
self.driver.find_element_by_id('su').click()
sleep(1)
assert self.driver.title == "pytest_百度搜索" # 根据进入的网页title做断言
#环境清理
@classmethod
def teardown_class(cls):
cls.driver.quit() #退出浏览器
if __name__ == '__main__':
pytest.main(['-s','test_selenium.py'])
直接使用selenium的原生代码编写有2个问题:
- 测试用例与自动化用例的定位符(如:百度搜索中的kw、su)之间没有分开,如果UI更改了属性值kw、su,所有涉及到这些元素的用例都要改,用例过多时,工作量将会更大
- 元素定位代码将在每个测试用例都需要重复的使用,造成代码冗余
——这2个问题,使用到POM就可以解决掉。
2、POM涉及模式的编码实现
目录:
base.py——基类,封装一些常用的方法
from selenium import webdriver
import pytest
import time
class BasePage:
"""
基础page层,封装一些常用的方法
"""
def __init__(self,driver):
#导入一下webdriver包,方便后边代码的编写
self.driver = webdriver.Chrome()
#打开页面
def open(self,url=None):
if url is None: #如果url没传参就会走这里,就会默认进入子类中的url
self.driver.get(self.url)
else:
self.driver.get(url)
#元素定位
def locator(self,name,value):#可直接使用8种单数形式的定位方法
return self.driver.find_element(name,value)
#获取title,就是获取网页标题栏
def get_title(self):
return self.driver.title
#获取页面text,获取页面文本,使用xpath定位
def get_text(self,path):
return self.locator("xpath",path).text #获取文本
#执行JavaScript
def js(self,script):#脚本作为参数传进来
self.driver.execute_script(script)
#休眠时间(等待时间)
def sleep(self,sec):
time.sleep(sec)
baidu_page.py页面对象类:
from base import BasePage
"""
baidu_page.py文件是用来存储百度页面
"""
#创建BaiduPage类继承BasePage
class BaiduPage(BasePage):
#定义url变量,供父类中的open()方法使用
url = "http://www.baidu.com"
#文本定位,并输入关键字
def search_input(self,search_key):
#使用父类locator方法来定位元素
#比原生的selenium更加精简
self.locator("id","kw").send_keys(search_key)
#按钮定位,并点击
def search_button(self):
self.locator("id","su").click()
test_baidu.py
结果:
============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: C:\Users\11130\PycharmProjects\pythonProject2\demo\data
plugins: forked-1.4.0, html-3.1.1, metadata-1.11.0, rerunfailures-10.2, xdist-2.5.0
collected 3 items
test_baidu.py ...
============================= 3 passed in 11.73s ==============================
——使用这样的方法,我们的代码将大幅度减少冗余,参数更加的便于管理。
总结:
感谢每一个认真阅读我文章的人!!!
我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。
Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628