PO模式
介绍
PO是Page Object(⻚⾯对象),将⾃动化涉及的⻚⾯或模块封装成对象,是一种思想。
解决的问题:
- 解决代码冗余
- 便于维护(脚本层与业务分离)-- 如果元素信息发⽣变化了,也不⽤去修改脚本。
非PO代码实现
# 非po模式实现登录
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestLogin:
def setup_class(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("http://127.0.0.1/Home/user/login.html")
self.driver.implicitly_wait(10)
def teardown_class(self):
time.sleep(4)
self.driver.quit()
def test_login(self):
# 在用户名输入框中输入13600000001
# driver.find_element(By.ID,"username").send_keys("13600000001")
self.driver.find_element(By.XPATH, "//*[contains(@placeholder,'手机号')]").send_keys("13600000001")
# 在密码输入框输入123456
# driver.find_element(By.ID,"password").send_keys("123456")
self.driver.find_element(By.XPATH, "//*[contains(@placeholder,'密码')]").send_keys("123456")
# 在验证码输入框输入8888
# driver.find_element(By.ID,"verify_code").send_keys("8888")
self.driver.find_element(By.XPATH, "//*[contains(@placeholder,'验证')]").send_keys("8888")
# 点击登录按钮
self.driver.find_element(By.XPATH, "//*[@name='sbtbutton']").click()
PO设计
以登录为例介绍PO模式,其中
- base: 存放所有Page页面公共方法
- page: 将页面封装为对象
- script: 测试脚本

base
base.py:分析要实现页面公共方法
'''
存放所有page页面的公共方法
'''
from selenium.webdriver.support.wait import WebDriverWait
class Base:
def __init__(self,driver):
self.driver = driver
# 查找元素
def base_find(self, loc, timeout = 10, poll_frequency = 0.5):
# 采用显示等待的方法获取元素
# 显示等待 -> 查找元素 loc = (By.ID,"userA") *loc=loc[0],loc[1]
el = WebDriverWait(self.driver,timeout,poll_frequency).until(lambda x:x.find_element(loc[0],loc[1]))
return el
# 输入方法
def base_input(self,loc,value):
# 1.获取元素
el = self.base_find(loc)
# 2.清空
el.clear()
# 3.输入
el.send_keys(value)
# 点击方法
def base_click(self,loc):
# 先找到元素再点击
self.base_find(loc).click()
# 获取元素文本方法
def base_get_text(self,loc):
# 先找到元素再获取
return self.base_find(loc).text
page
page_login.py:
'''
模块名:page_模块单词
类名;大驼峰形式,去掉下划线和数字
方法:自动化测试中要用到哪些元素就封装哪些方法
'''
from selenium.webdriver.common.by import By
from base.base import Base
# 配置信息
username = (By.XPATH, "//*[contains(@placeholder,'手机号')]")
pwd = (By.XPATH,"//*[contains(@placeholder,'密码')]")
code = (By.XPATH,"//*[contains(@placeholder,'验证')]")
login_btn = (By.XPATH,"//*[@name='sbtbutton']")
nickname = (By.CSS_SELECTOR,".userinfo")
class PageLogin(Base):
# 输入用户名
def page_username_input(self,value):
self.base_input(username,value)
# 输入密码
def page_pwd_input(self,value):
self.base_input(pwd,value)
# 输入验证码
def page_code_input(self,value):
self.base_input(code,value)
# 点击登录
def page_clink_button(self):
self.base_click(login_btn)
# 获取昵称
def page_nickname(self):
self.base_get_text(nickname)
# 为了测试业务的时候方便,需要有组合业务
def page_test_login(self,phone,password,code2):
self.page_username_input(phone)
self.page_pwd_input(password)
self.page_code_input(code2)
self.page_clink_button()
script
test01_login.py:
import time
from selenium import webdriver
from page.page_login import PageLogin
class TestLogin:
def setup_class(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("http://127.0.0.1/Home/user/login.html")
self.login = PageLogin(self.driver)
def teardown_class(self):
self.driver.quit()
def test01_login(self,phone="13600000001",password="123456",code2="8888"):
# 调用page_login里面的page_test_login方法来进行测试
self.login.page_test_login(phone,password,code2)
# 断言
nickname = self.login.page_nickname()
print("nickname:", nickname)

浙公网安备 33010602011771号