PO模式学习
1 po模式
V1:不采用任何模式,线性模型
V2:采用unittest框架
V3:业务代码和页面对象进行
V4:实际中po模式书写
V5:
V6:
2.2 案例
V1: 无法批量运行
test_login_username_not_exit.py
import unittest
from selenium import webdriver
driver=webdriver.Firefox()
driver.maxmize_window()
diiver.implicitily_wait(30)
url="http://baidu.com"
driver.get(url)
#点击登录
driver.find_element_by_partial_link_text("登录").click()
#输入用户名
driver.find_element_by_css_selector("#username").send_keys("13811112222")
#输入密码
driver.find_element_by_css_selector("#password").send_keys("123456")
#输入验证码
driver.find_element_by_css_selector("#verify_code").send_keys("888888")
#点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
#输出提示信息
msg=driver.find_element_by_css_selector(".layui-layer-content").text
#断言
assert msg=="用户名不存在!"
#点击确定按钮
driver.find_element_by_css_selector(".layui=layer-btn0").click()
#关闭
driver.quit()
test_login_password_error.py
import unittest
from selenium import webdriver
driver=webdriver.Firefox()
driver.maxmize_window()
diiver.implicitily_wait(30)
url="http://baidu.com"
driver.get(url)
#点击登录
driver.find_element_by_partial_link_text("登录").click()
#输入用户名
driver.find_element_by_css_selector("#username").send_keys("13800001111")
#输入密码
driver.find_element_by_css_selector("#password").send_keys("123123")
#输入验证码
driver.find_element_by_css_selector("#verify_code").send_keys("888888")
#点击登录按钮
driver.find_element_by_css_selector(".J-login-submit").click()
#输出提示信息
msg=driver.find_element_by_css_selector(".layui-layer-content").text
#断言
assert msg=="密码错误!"
#点击确定按钮
driver.find_element_by_css_selector(".layui=layer-btn0").click()
#关闭
driver.quit()
V2 使用unittest
test_login.py
问题:业务脚本与页面对象没有分开(代码冗余)
#导包
import unittest
from selenium import webdriver
#新建测试类
class Test_login(unittest.TestCase):
#初始化
def setUp(self):
self.driver=driver
driver=webdriver.Firefox()
driver.maxmize_window()
driver.implicitily_wait(30)
driver.get("http://xxxx")
driver.find_element_by_partial_link_text("登录").click()
#结束tearDown
def tearDown(self):
self.driver.quit()
#新建测试类方法 用户名不存在
def test_login_usename_not_exit(self):
pass
#新建测试类方法 密码错误
def test_login_password_error(self):
pass
V3 页面代码和页面对象进行
PO: page object(页面对象)
把一个页面封装为class:
项目文件夹
:page
、scripts
、
**V4 **
项目文件夹
:base
, page
、scripts
、
base文件夹
base.py
from selenium.webdriver.support.wait import WebDriverWait
class Base: # page页面一些公共的方法
# 初始化方法
def __init__(self):
# self.driver =driver
#临时代替driver
self.driver=webdriver.FireFox()
self.driver.maxmize_window()
self.driver.get("http://localhost")
# 查找元素方法(提供点击、输入)
def base_find_element(self,loc,timeout=30,poll=0.5):
return WebDriverWait(self.driver,timeout=timeout,poll_frequency=poll ).until(lambda x: x.find_element(*loc)) #显式等待 导包 *loc为解包
# 点击方法
def base_click(self,loc):
self.base_find_element(loc).click()
# 输入方法
def base_input(self,loc,value):
el=self.find_element(loc)
el.clear()
el.send_keys(value)
# 获取文本方法
def base_get_text(self,loc):
return self.find_element(loc).text
#截图方法
def base_get_image(self):
self.driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))
注意:
1. 扩展:loc类型为元组 *loc
2.注意:
base基类方法封装时,解包主要要一次,在查找元素中解包
driver为虚拟,谁调用base是,谁传入,无需关注从哪里来
loc真正使用loc的方法
pages
file
__init__.py
文件
from selenium.webdriver.common.by import By
'''以下信息为登录页面元素配置信息,临时存放地'''
#登录链接
login_link=By.PARTITAL_LINK_TEXT,"登录"
#用户名
login_username=By.ID,"username"
#密码
login_pwd=By.ID,"verify_code"
#验证码
login_btn=By.CSS_SELECTOR,".J-login-submit"
#获取异常文本
login_err_info=By.CSS_SELECTOR,".layui-layer-content"
#点击异常文本 按钮
login_err_btn_ok=By.CSS_SELECTOR,".layui-layer-btn0"
'''以下为订单页面配置数据'''
'''以下为支付页面配置数据'''
page_login.py
from V4 import page
class PageLogin(Base):
#点击登录链接
def page_click_login_link(self):
self.base_click(page.login_link)
#输入用户名
def page_input_username(self,username ):
self.base_input_username(page.login_username,username)
#使用密码
def page_input_password(self,pwd):
self.base_input_pwd(page.login_pwd,pwd)
#输入验证码
def page_input_verify_code(self,code):
self.base_input_verify_code(page.login_verify_code,code)
#点击登录按钮
def page_click_login_btn(self):
self.base.click(page.login_btn)
#获取异常信息
def page_get_error_info(self):
return self.base.get_error_info(page.login_err_info)
#点击异常信息框 确定
def page_click_error_btn_ok(self):
self.base_click(page.login_err_btn_ok)
#截图
def page_get_screenshot(self):
self.base_get_image()
# 组装
def page_login(self,username,pwd,code):
self.page_input_username(username)
self.page_input_pwd(pwd)
self.page_input_verify_code(code)
self.page_click_login_btn()
scripts文件夹
test_login.py
#导包
import unittest
from V4.page.page_login import PageLogin
from parameterized import parameterized
def get_data(self):
return [("13822223333","123456","8888","账号不存在!"), ("13800001111","123123","8888","账号错误!"),("13800001111","123456","6666","验证码错误!")]
#新建测试类并继承
class TestLogin(unittest.TestCase):
login = None
#setup
def setUp(self):
#实例化 获取页面对象PageLogin
self.login=PageLogin()
#点击登录链接
self.login.page_click_login_link()
#setupclass
@classmethod
def setUpClass(cls):
cls.login=PageLogin()
#点击登录链接
cls.login.page_click_login_link()
#tearDown
def tearDown(self):
#关闭驱动对象
self.login.driver.quit()
#tearDownclass
@classmethod
def tearDownClass(cls):
#关闭驱动对象
cls.login.driver.quit()
#登录测试方法
@parameterized.expend(get_data())
def test_login(self,username,pwd,code,expect_result):
#调用登录方法
self.login.page_login(username,pwd,code)
#获取登录信息
msg=self.login.page_get_error_info()
#断言
try:
self.assertEqual(msg,expect_result)
#截图
except AssertionError:
self.login.page_get_image()
ps: 猫猫能有什么想法呢