python PO 模型

模型介绍:

在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率

优点:重用,业务和对象分离,代码结构清晰,方便代码维护

 PO的核心:

  1. PO 模式中抽离封装集成一个 BasePage 类,该基类应该拥有一个只实现 webdriver 实例的属性
  2. 每一个 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

设置定时时间

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值