POM是目前业内公认最佳的一种设计模式。是专门用于对应制定系统来量身打造的一套测试框架。
登录——进入个人中心——修改个人信息并保存——再重新查看个人信息详情
在POM体系下,全程都是基于页面来考虑这个流程的执行连贯性,中间会关联多少页面,每个页面分别会执行哪些内容。
1. 基类:逻辑代码的部分,主要是生产一系列在页面对象中可以被调用的函数。本身作为一个工具库的存在。
2. 页面对象类:逻辑代码的部分。结合实际的项目,提取的所有可被自动化执行的页面。类中包含页面的核心元素与页面的核心流程。
3. 测试用例类:测试代码部分。用于拼接各类页面对象,实现最终的测试流程
4. 测试数据类:用于提取所有在实际测试过程中需要应用的数据内容。
自动化测试的实现一定是要关联到核心业务来走的,没有关联业务的自动化是无法实现落地的。
DDT+Yaml或者是常规的DDT+DATA的形态来实现数据驱动。
一、基础配置内容 base,页面点击、输入、元素获取等方法
import time class BasePage: def __init__(self,driver): self.driver=driver #访问url def visit(self,url): self.driver.get(url) #元素定位 def locator(self,loc): return self.driver.find_element(*loc) #输入 def input(self,loc,text ): self.locator(loc).send_keys(text) #点击 def click(self,loc): self.locator(loc).click() #等待 def wait(self,loc): time.sleep(loc)
二、新建页面对象page_object
新建登陆页面对象LoginPage.py
from base.base_page import BasePage from selenium.webdriver.common.by import By class LoginPage(BasePage): url ="http://39.98.138.157/shopxo/index.php?s=/index/user/logininfo.html" user = (By.NAME,'accounts') password = (By.NAME,'pwd') login_button=(By.XPATH,'/html/body/div[4]/div/div[2]/div[2]/form/div[3]/button') def login(self,username,pwd): self.visit(self.url) self.input(self.user,username) self.input(self.password,pwd) self.click(self.login_button)
新建页面对象IndexPage.py
from base.base_page import BasePage from selenium.webdriver.common.by import By class IndexPage(BasePage): url ="http://39.98.138.157/shopxo/index.php" search_input = (By.NAME,'wd') search_button = (By.ID,'ai-topsearch') login_button=(By.XPATH,'/html/body/div[4]/div/div[2]/div[2]/form/div[3]/button') def search(self,text): self.visit(self.url) self.input(self.search_input,text) self.click(self.search_button )
三、数据管理data,变量数据存储在yaml文件中进行管理,新建user.yaml文件,在测试用例中通过file_data进行读取测试
- username: xxxxx password: '111111' - username: admin password: '123456'
四、测试用例实现test_case
import time import unittest from selenium import webdriver from page_object.login_page import LoginPage from page_object.index_page import IndexPage #ddt 数据驱动模式 from ddt import ddt,file_data,data @ddt class TestCase(unittest.TestCase): @classmethod def setUpClass(cls) ->None : cls.driver = webdriver.Chrome() cls.lp = LoginPage(cls.driver) cls.ip = IndexPage(cls.driver) @classmethod def tearDownClass(cls) -> None: cls.driver.quit() #数据驱动,读取yaml 文件中数据 @file_data('../data/user.yaml') def test1_login(self,username, password): self.lp.login(username, password) time.sleep(5) #@data 中数据直接被txt读取到 在同一个页面实现多次搜索 @data('手机','衣服','耳机') def test2_search(self,txt): self.ip.search(txt) time.sleep(3) if __name__ == '__main__': unittest.main()