python之PO模式--初实现web自动化

92 阅读2分钟

设计模式: PO、关键字驱动

POpage 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()