UI自动化测试(Python)Web-PO设计模式

482 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

src=http___i.cqdj.cc_forum_201307_27_160601dupc4j8gucap6mld.gif&refer=http___i.cqdj.gif

   您好,我是游手好闲的小羊!

前言:本人是一名软件测试开发工程师,在接下来的一段时间里会介绍自动化测试框架,希望大家多多支持!

在介绍PO之前,我想问大家对于两条测试用例,让几个人来写自动化框架可能能会写出不同测试框架,我大概能给大家列举出来!
第一种:无任何模式(耗时耗力)
第二种:使用PyTest管理用例,并断言用例的执行结果
第三种:方法封装
第四种:采用PO模式的分层思想对代码进行拆分
第五种:对PO分层之后的代码继续优化
第六种:把共同操作提取封装到父类中,子类直接调用父类的方法,避免代码冗余(也是我们重点讲解的一种) 介绍完这几种就可以进入正题了。

一、什么是PO设计模式

PO是Page Object的缩写,PO模式是自动化测试项目开发实践的最佳设计模式之一。 核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化, 只 需要调整页面元素封装的代码,提高测试用例的可维护性、可读性。

可能大家不太理解:通俗说就是在做UI自动化时定位元素特别依赖页面,一旦页面发生变更就不得不跟着去修改定位元素的代码。 如下面的代码:

driver.find_element_by_id("login-btn").click()

存在的问题不难看出:
1.如果开发人员修改了这个元素的id,这时候你就不得不修改所有对应的代码
2.存在大量冗余代码
这也就引入了我们的PO设计模式的原因: 减少冗余代码、业务代码和测试代码被分开,降低耦合性、维护成本低

二、PO模式

PO模式就是把一个页面分为三层,对象库层、操作层、业务层。

  • 对象库层:封装定位元素的方法。
  • 操作层:封装对元素的操作。
  • 业务层:将一个或多个操作组合起来完成一个业务功能。比如登录:需要输入帐号、密码、点 击登录三个操作。

三、使用PO模式

对象层:

from po.utils import DriverUtil

class LoginPage:
   def __init__(self):
    self.driver = DriverUtil.get_driver()
    # 用户名输入框
    self.username = None
    # 密码
    self.password = None
    # 验证码输入框
    self.verify_code = None
    # 登录按钮
    self.login_btn = None
    # 忘记密码
    self.forget_pwd = None
   def find_username(self):
        return self.driver.find_element_by_id("username")
  def find_password(self):
    return self.driver.find_element_by_id("password")
  def find_verify_code(self):
    return self.driver.find_element_by_id("verify_code")
  def find_login_btn(self):
    return self.driver.find_element_by_name("sbtbutton")
  def find_forget_pwd(self):
    return self.driver.find_element_by_partial_link_text("忘记密码")

操作层:

class LoginHandle:
    def __init__(self):
        self.login_page = LoginPage()
    def input_username(self, username):
        self.login_page.find_username().send_keys(username)
    def input_password(self, pwd):
        self.login_page.find_password().send_keys(pwd)
    def input_verify_code(self, code):
        self.login_page.find_verify_code().send_keys(code)
    def click_login_btn(self):
        self.login_page.find_login_btn().click()
    def click_forget_pwd(self):
        self.login_page.find_forget_pwd().click()

业务层

class LoginProxy:
    def __init__(self):
        self.login_handle = LoginHandle()
    # 登录
    def login(self, username, password, verify_code):
    # 输入用户名
        self.login_handle.input_username(username)
    # 输入密码
        self.login_handle.input_password(password)
    # 输入验证码
        self.login_handle.input_verify_code(verify_code)
    # 点击登录按钮
        self.login_handle.click_login_btn()
    # 跳转到忘记密码页面
    def to_forget_pwd_page(self):
    # 点击忘记密码
        self.login_handle.click_forget_pwd()

每天分享一点点,我是带你学习的小羊!