1、pageObject设计模式
原思想:将操作细节,和断言等操作混合
PO设计思想:将操作细节封装,只暴露接口供调用,大大的减少了代码维护更新的工作量
2、PO六大原则
方法:
(1)公共方法取代页面功能
(2)方法return到新页面或返回同于断言的数据
(3)同页面的不同的结果 建模不同的方法
(4)不在方法内使用断言
字段:
(1)不要暴露页面内部元素给外部
(2)不要去建模整个页面 只为页面重要的元素进行建模
3、代码示例
(1)目录结构
(2)main.py
from selenium.webdriver.common.by import By
from page.base_page import BasePage
from page.register import Register
from page.login import Login
class Main(BasePage):
base_url = 'https://work.weixin.qq.com/'
def go_to_register(self):
self.find(By.XPATH,'//*[@id="tmp"]/div[1]/a').click()
return Register(self._driver)
def go_to_login(self):
self.find(By.XPATH,'//*[@id="indexTop"]/div[2]/aside/a[1]').click()
return Login(self._driver)
(3)base.py
from selenium import webdriver
class BasePage:
base_url = ''
def __init__(self, driver: webdriver = None):
self._driver = ""
if driver is None:
self._driver = webdriver.Chrome()
else:
self._driver = driver
if self.base_url != "":
self._driver.get(self.base_url)
def find(self, by, locator):
return self._driver.find_element(by, locator)
(4)login.py
from selenium.webdriver.common.by import By
from page.base_page import BasePage
from page.register import Register
class Login(BasePage):
def scan(self):
pass
def go_to_register(self):
self.find(By.XPATH,'//*[@id="wework_admin.loginpage_wx_$"]/main/div[2]/a').click()
return Register(self._driver)
(5)register.py
from selenium.webdriver.common.by import By
from page.base_page import BasePage
from page._main import Main
class Register(BasePage):
def register(self):
self.find(By.XPATH, '//*[@id="corp_name"]').send_keys("hello")
self.find(By.XPATH, '//*[@id="manager_name"]').send_keys("demaxiya")
return True
def go_to_main(self):
self.find(By.XPATH, '//*[@id="wework_admin.register_wx2_$"]/header/div/a/h1').click()
return Main(self._driver)
(6)test_register.py
from page._main import Main
class TestRegister:
def setup(self):
self._main = Main()
def test_register(self):
assert self._main.go_to_register().register()
4、复用浏览器
(1)配置Chromedriver到系统的环境变量
(2)配置Chrome浏览器到系统的环境变量
(3)命令:chrome --remote-debugging-port=9222
(4)进入到需要操作的页面
(5)执行测试用例
5、构建思路
(1)梳理测试用例
页面与页面之间的关系
编写时序图进行梳理
(2)构造PO模型
构造页面相关的类和方法
实现暂时设置为pass
(3)编写测试用例
根据业务逻辑编写
链式调用--方法返回页面对象的示例
(4)填充具体的实现
元素定位
等待
base_page
(5)优化用例
解决封装样板代码,解决技术栈更换问题
页面元素提取出来,增强复用性
对比PO六大原则