基于pytest的主流POM模式——测试框架的设计与实现
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
import pytest from selenium import webdriver from baidu_page import BaiduPage from time import sleep class Test_Baidu(): # 环境准备 @classmethod def setup_class(cls): cls.driver = webdriver.Chrome() def test_baidu_search_case01(self): page = BaiduPage(self.driver) # 使用BaiduPage基类,以及继承的父类的方法,就可以直接使用了 page.open() # 在BaiduPage中已经配置url了,这里就不需要配置了 page.search_input("狗狗币") page.search_button() sleep(2) assert self.driver.title == "狗狗币_百度搜索" def test_baidu_search_case02(self): page = BaiduPage(self.driver) page.open() page.search_input("selenium") page.search_button() sleep(2) assert self.driver.title == "selenium_百度搜索" def test_baidu_search_case03(self): page = BaiduPage(self.driver) page.open() page.search_input("pytest") page.search_button() sleep(2) assert self.driver.title == "pytest_百度搜索" # 环境清理 @classmethod def teardown_class(cls): cls.driver.quit() # 退出浏览器 if __name__ == '__main__': pytest.main(['-s','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 ==============================
——使用这样的方法,我们的代码将大幅度减少冗余,参数更加的便于管理。
本文来自博客园,作者:他还在坚持嘛,转载请注明原文链接:他还在坚持嘛 https://www.cnblogs.com/brf-test/p/15750716.html