设计模式:
PO
、关键字驱动
PO:page object model 页面对象模型
,“PageObject” 自动化设计模式,简称 “PO模式”
什么是PO模式:
一种在测试自动化中变得流行的设计模式,使得自动化测试脚本的代码量减少,避免代码重复,更加易读,减少维护的成本。
PO设计模式多分为三层:
1、基础层
:base,主要放的是selenium原生的方法
。比如:打开浏览器,加载网页,定位元素
2、面向对象层
:pageobject,主要放页面的元素以及页面的动作
。一个页面就是一个类
3、测试用例层
:testcase,存放一些测试用例和测试数据
三者之间关系:
pageobject继承
base基础层 , testcase调用
pageobject层
PO模式初实现简单登录百度用例 (----初学者先编写线性脚本,对照线性脚本写PO模式用例)\
如:基础层
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
# PO模式第1层----基础层
class BasePage:
def open_browser(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(5)
def get_url(self, url):
self.driver.get(url)
def element_position(self, args):
return self.driver.find_element(*args)
def send_keys(self, args, value):
self.element_position(args).send_keys(value)
def click(self, args):
self.element_position(args).click()
def action_chains(self, args):
my_action = ActionChains(self.driver)
my_action.move_to_element(self.element_position(args)).perform()
def maximize_window(self):
self.driver.maximize_window()
def sleep_current(self, seconds):
sleep(seconds)
面向对象层:
from selenium.webdriver.common.by import By
from base.base_page import BasePage
# PO模式第2层----面向对象层(一个页面一个类)
class LoginPage(BasePage):
# 封装页面元素,统一管理
current_url = "https://www.baidu.com/?tn=baiduhome_pg"
login_text = (By.LINK_TEXT, "登录")
username_pos = (By.NAME, "userName")
password_pos = (By.XPATH, "//input[@name='password' and @autocomplete='off']")
login_submit = (By.XPATH, "//input[@id ='TANGRAM__PSP_11__submit' and @value='登录']")
# 封装页面动作,统一管理
def login(self):
self.open_browser()
self.get_url(self.current_url)
self.click(self.login_text)
self.send_keys(self.username_pos, "xxxx")
self.action_chains(self.password_pos)
self.send_keys(self.password_pos, "xxxxx")
self.click(self.login_submit)
self.maximize_window()
self.sleep_current(10)
测试用例层:
import unittest
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from pageobject.login_page import LoginPage
class TestLogin(unittest.TestCase):
# 登录百度账号测试用例(-----解决:密码框无法输入问题)
def test_01_login(self):
"""
++++++++++++++++++++++++++++++++
------线性代码测试登录用例----------
++++++++++++++++++++++++++++++++
driver = webdriver.Chrome()
# ActionChains模拟鼠标移动、按键操作
my_action = ActionChains(driver)
# 隐式等待,作用于webdriver对象的整个生命周期
driver.implicitly_wait(5)
driver.get("https://www.baidu.com/?tn=baiduhome_pg")
driver.find_element(By.LINK_TEXT, "登录").click()
# 定位【手机号/用户名/邮箱】
driver.find_element(By.NAME, "userName").send_keys("xxxx")
# 查看元素【密码】是否定位成功,通过打印元素class属性
class_value = driver.find_element(By.XPATH, "//input[@name='password' and @autocomplete='off']").get_attribute("class")
print(class_value+"\n"+"杨小二test")
# 定位成功,将鼠标放在该元素上
my_action.move_to_element(driver.find_element(By.XPATH, "//input[@name='password' and @autocomplete='off']")).perform()
# 重新定位元素并点击元素,再输入【密码】
# driver.find_element(By.XPATH, "//input[@name='password' and @autocomplete='off']").click()
driver.find_element(By.XPATH, "//input[@name='password' and @autocomplete='off']").send_keys("xxxx")
# 定位【登录】按钮
driver.find_element(By.XPATH, "//input[@id ='TANGRAM__PSP_11__submit' and @value='登录']").click()
driver.maximize_window()
sleep(10)
"""
# PO模式的测试用例层 --测试用例层只有该简单的2步即可
lp = LoginPage()
lp.login()