模型介绍:
在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率
优点:重用,业务和对象分离,代码结构清晰,方便代码维护

PO的核心:
-
在 PO 模式中抽离封装集成一个 BasePage 类,该基类应该拥有一个只实现 webdriver 实例的属性
-
每一个 page 都继承 BasePage ,通过 driver 来管理本 page 中元素,将 page 中的操作封装成一个个方法
3.TestCase继承unittest.Testcase类,并依赖page类,从而实现相应的测试步骤
非
PO
实现
from selenium import webdriver
#打开浏览器
driver=webdriver.Chrome("chajian/chromedriver.exe")
#最大化窗口
driver.maximize_window()
#隐形等待
driver.implicitly_wait(30)
#进入商城
driver.get("http://127.0.0.1")
#点击登录
driver.find_element_by_link_text("登录").click()
#输入账号
driver.find_element_by_id("username").send_keys(18639263271)
#输入密码
driver.find_element_by_id("password").send_keys(123456)
#输入验证码
driver.find_element_by_id("verify_code").send_keys(8888)
#登陆账号
driver.find_element_by_link_text("登 录").click()
#回到主页
driver.find_element_by_xpath('/html/body/div[2]/div/div[3]/ul/li[1]/a').click()
#搜索框输入
driver.find_element_by_id("q").send_keys("小米")
#点击搜索
driver.find_element_by_class_name("ecsc-search-button").click()
#进入商品详细界面
driver.find_element_by_xpath("/html/body/div[3]/div/div/dl[2]/dd/div[1]/div/div/a[2]/span").click()
#点击价格筛选
driver.find_element_by_class_name('lazy-list').click()
#选择型号
driver.find_element_by_link_text('128G').click()
#加入购物车
driver.find_element_by_class_name('addcar').click()
#关闭网页
driver.quit()
不同的运行脚本环境,游览器不同:驱动
webdriver.Firefox()
可以剥离
请求地址的变化
(
生产环境和测试环境
):url = http://127.0.0.1
可以剥离
操作元素时,常常要等待元素加载完成方可进行操作:可以把
webdriver
提供的
find_element*
方法封
装,在元素操作前,先判断元素是否可以操作
实际测试场景中,可能有多个测试场景,如果每个测试场景都需要维护
url,
游览器驱动
,
元素定位等
,
效
率会非常低
因此基于以上分析,是否可以设计一个所有测试界面(
selenium
本身是
B/S
系统开展测试)的基类,来
维护公共的方法,此处定义名字为
BasePage.py,
用于存放页面公共方法及
webdriver
原有方法二次封装等。
PO
实现
BasePage
代码实现
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
class BasePage():
def __init__(self,driver):
self.driver=driver
def get(self,url):
self.driver.get(url)
def get_element(self,*locator):
return self.driver.find_element(*locator)
def left_click(self,*locator):
ActionChains(self.driver).click(self.get_element(*locator)).perform()
def send_text(self,text,*locator):
self.driver.find_element(*locator).send_keys(text)
def clear_text(self,*locator):
self.driver.find_element(*locator).clear()
def switch_iframe(self,*locator):
self.driver.swich_to.frame(self.driver.find_element(*locator))
def switch_window(self,n):
self.driver.swich_to.window(self.driver.window_handles[n])
SearchPage
代码实现
page1
from selenium.webdriver.common.by import By
from basepage.basepage import BasePage
class Page1(BasePage):
def __init__(self,driver):
BasePage.__init__(self,driver)
def openshop(self,url):
self.get(url)
def click_login(self):
self.left_click(By.LINK_TEXT,"登录")
page2
from selenium.webdriver.common.by import By
from basepage.basepage import BasePage
class Page2(BasePage):
def __init__(self,driver):
BasePage.__init__(self,driver)
def inputzh(self,text):
self.send_text(text,By.ID,"username")
def inputmm(self,text):
self.send_text(text,By.ID,"password")
def inputyzm(self,text):
self.send_text(text,By.ID,"verify_code")
def click_login(self):
self.left_click(By.LINK_TEXT,"登 录")
page3
from selenium.webdriver.common.by import By
from basepage.basepage import BasePage
class Page3(BasePage):
def __init__(self,driver):
BasePage.__init__(self,driver)
def click_shouye(self):
self.left_click(By.XPATH,'/html/body/div[2]/div/div[3]/ul/li[1]/a')
def input_search(self,text):
self.send_text(text,By.ID,"q")
def click_search(self):
self.left_click(By.CLASS_NAME,"ecsc-search-button")
page4
from selenium.webdriver.common.by import By
from basepage.basepage import BasePage
class Page4(BasePage):
def __init__(self,driver):
BasePage.__init__(self,driver)
def click_goods(self):
self.left_click(By.XPATH,"/html/body/div[3]/div/div/dl[2]/dd/div[1]/div/div/a[2]/span")
def click_sx(self):
self.left_click(By.NAME,'lazy-list')
def click_xh(self):
self.left_click(By.LINK_TEXT,'128G')
def click_shoplist(self):
self.left_click(By.CLASS_NAME,'addcar')
TestCase
代码+unittest=htmltestrunne
import sys,os
curPath = os.path.abspath(os.path.dirname(__file__))
rootpath = os.path.split(curPath)[0]
sys.path.append(rootpath)
import unittest
from selenium import webdriver
from pages.page1 import Page1
from pages.page2 import Page2
from pages.page3 import Page3
from pages.page4 import Page4
from common.HTMLTestRunner import HTMLTestRunner
class ShopUiTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Chrome(r"B:\admins\pyc\selenium0831\chajian\chromedriver.exe")
cls.driver.maximize_window()
cls.driver.get("http://127.0.0.1")
cls.driver.implicitly_wait(30)
def test_001(self):
x=Page1(self.driver)
x.click_login()
def test_002(self):
x=Page2(self.driver)
x.inputzh(18639263271)
x.inputmm(123456)
x.inputyzm(8888)
x.click_login()
def test_003(self):
x=Page3(self.driver)
x.click_shouye()
x.input_search("小米")
x.click_search()
def test_004(self):
x=Page4(self.driver)
x.click_goods()
x.click_sx()
x.click_xh()
x.click_shoplist()
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
if __name__ == '__main__':
unittest.main()
class Method():
def method(self):
suite=unittest.TestSuite()
lis=['test_001','test_002','test_003','test_004']
for i in lis:
suite.addTest(ShopUiTest(i))
with open("../report1.html","wb") as f:
HTMLTestRunner(
stream=f,
title="un2",
description="no2",
verbosity=2
)
持续集成
打开jenkins+tomcat
开启新项目
输入命令:python B:\admins\pyc\selenium0831\testcase\uitests.py
设置定时时间