• web自动化测试(9)--PO设计模式(一)


    传统的设计中,在新增测试用例之后,测试代码会有如下几个问题:

    (1)易读性差:一连串的find_element和wait.until会使代码显得杂乱无章,不方便阅读;

    (2)可扩展性不好:用例孤立,无法扩展;

    (3)可复用性差:无公共方法,很难进行复用;

    (4)可维护性差:一旦页面元素发生变化,需要维护修改大量的测试用例。

    所以,我们有必要掌握PO设计模式,以弥补传统设计的不足。

    PO(Page Object)设计模式是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,我们在实际测试中只需关注业务流程就可以了。

    PO设计模式是一种自动化测试设计模式:将测试对象测试用例进行分离,此时测试对象只需负责页面元素的定位和对元素进行相应的操作,因此我们可以将测试对象,即页面封装成一个类,其中,

    类的属性:页面元素的定位

    类的方法:对页面元素的操作

    通过上述的描述,我们可以简单的将PO理解为:

    (1)PO对象是一种设计模式,用来管理和维护一组web元素的对象库;

    (2)在PO设计模式下,应用程序的每一个页面都有一个对应的page类;

    (3)每一个page类只需负责维护该web页面的元素和操作这些元素的方法;

    (4)每一个page中方法的名称最好根据相应的业务场景进行命名,做到见名识意。例如通常我们登陆成功后,在进行下一个业务操作时,通常需要等待几秒钟,此时我们可以使用这样的命名方法:waitint_for_login_success()或者waitingForLoginSuccess();

    (5)测试用例=调用页面类的方法+测试数据 -- 本节中暂时还未将测试数据和测试用例进行分离,只涉及设计测试用例和测试对象的分离;

    (6)测试用例中可能会涉及多个测试对应,如 1个用例 = 页面A + 页面B + 页面C + 页面D等。

    下面我们将通过具体的实例,进一步理解PO设计模式。

    场景描述:使用用户名和密码登录课堂派,要求使用PO设计模式。

    操作流程:

    (1)先梳理业务,根据业务需求使用excel编写测试用例;

    (2)明确测试用例中需要使用的页面和测试数据以及断言;  --  此时需要熟悉测试用例中每一步的操作流程,代码可以先不用实现

    (3)实现具体的页面对象和页面元素定位;

    (4)准备测试数据 -- 使用python代码来存放测试数据;

    (5)页面对象和测试数据准备就绪后,对测试用例进行填充。

    代码实现:

    (1)代码组织结构:

    (2)各部分实现

    conftest.py

    • 前置:实例化dirver,并且访问课堂派登录页面,返回driver对象
    • 后置:关闭浏览器
     1 import pytest
     2 from selenium import webdriver
     3 
     4 @pytest.fixture
     5 def init():
     6     # 实例化driver,访问登录页面
     7     driver = webdriver.Chrome()
     8     driver.get("https://www.ketangpai.com/#/login")
     9     yield driver
    10     driver.quit()

    pageObjects.login_page.py:登录页面元素定位和操作

     1 from selenium.webdriver.remote.webdriver import WebDriver    # 引入webDriver的父类
     2 from selenium.webdriver.common.by import By
     3 from selenium.webdriver.support import expected_conditions as EC
     4 from selenium.webdriver.support.wait import WebDriverWait
     5 
     6 class LoginPage:
     7 
     8     # 对待操作的元素进行定位:类属性
     9     user_loc = (By.XPATH, '//input[@placeholder="请输入邮箱/手机号/账号"]')
    10     pwd_loc = (By.XPATH, '//input[@placeholder="请输入密码"]')
    11     btn_loc = (By.XPATH, '//button[contains(@class,"primary")]')
    12 
    13     def __init__(self,driver:WebDriver):   # driver:WebDriver明确传入参数的属性
    14         self.driver = driver
    15         self.wait = WebDriverWait(self.driver,20)
    16         pass
    17 
    18     # 登录相关操作
    19     def login(self,user,password):
    20         self.wait.until(EC.visibility_of_element_located(self.btn_loc))
    21         self.driver.find_element(*self.user_loc).send_keys(user)
    22         self.driver.find_element(*self.pwd_loc).send_keys(password)
    23         ele = self.driver.find_element(*self.btn_loc)
    24         js_code = "arguments[0].click()"
    25         self.driver.execute_script(js_code, ele)  # 使用js执行页面的点击操作

    pageObjects.home_page.py:主页面元素定位和操作

     1 from selenium.webdriver.remote.webdriver import WebDriver    # 引入webDriver的父类
     2 from selenium.webdriver.common.by import By
     3 from selenium.webdriver.support import expected_conditions as EC
     4 from selenium.webdriver.support.wait import WebDriverWait
     5 
     6 class HomePage:
     7 
     8     assign_loc = (By.XPATH,'//span[@title="任务管理"]')
     9 
    10     def __init__(self,driver:WebDriver):
    11         self.driver = driver
    12         self.wait = WebDriverWait(self.driver,6)
    13         pass
    14 
    15     # 判断任务元素是否存在
    16     def is_assign_exist(self):
    17         # 判断元素是否可见
    18         try:
    19             self.wait.until(EC.visibility_of_element_located(self.assign_loc))
    20         except:
    21             return False
    22         else:
    23             return True

    testCases.test_login.py

     1 import pytest
     2 from pageObjects.login_page import LoginPage
     3 from pageObjects.home_page import HomePage
     4 
     5 @pytest.mark.usefixtures  
     6 class TestLogin:
     7 
     8     def test_login(self,init):      # int为前置返回的driver对象,在实例化页面对象时,需要使用driver对象
     9         LoginPage(init).login("1522317xxxx","jyfxxxxxx")
    10         # 断言
    11         assert HomePage(init).is_assign_exist()

    小结:

    在本节中,我们了解了selenium自动化测试中的PO设计模式,并通过具体的案例实现了测试对象和测试用例的分离。

  • 相关阅读:
    [Canvas]英雄可以射箭了
    [Canvas]人物型英雄出现(前作仅为箭头)
    day33_Spring学习回顾_01
    day33_Spring学习笔记_01
    MyEclipse中,当我们写一个类实现一个接口时,会自动生成重写该接口的方法,但是,方法的参数提示不够好,是什么原因导致的呢?该如何解决呢?
    使用Junit测试一个 spring静态工厂实例化bean 的例子,所有代码都没有问题,但是出现java.lang.IllegalArgumentException异常
    MyEclipse中如何变换查看项目文件夹
    实战网卡bond
    Centos7上使用官方YUM源安装Mysql
    CentOS 7上安装WordPress详细步骤
  • 原文地址:https://www.cnblogs.com/yif930916/p/14803236.html
Copyright © 2020-2023  润新知