zoukankan      html  css  js  c++  java
  • web自动化测试(10)--PO设计模式(二)

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

    但是这种分离还不够彻底,在本节中,我们将对上一节的案例进行进一步的改进,实现:

    (1)将测试数据从测试用例中分离出来;

    (2)将页面元素的定位总页面对象中分离出来。

    场景描述:使用用户名和密码登录课堂派,要求使用PO设计模式(使用python文件来存放测试数据)

    操作流程:

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

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

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

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

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

    代码实现:

    (1)代码组织结构:

     (2)各部分代码实现

    pageLocators:

    login_page_locs

     1 """
     2 登录页面元素定位
     3 """
     4 
     5 from selenium.webdriver.common.by import By
     6 
     7 class LoginPageLocs:
     8     # 用户名输入框
     9     user_loc = (By.XPATH, '//input[@placeholder="请输入邮箱/手机号/账号"]')
    10     # 密码输入框
    11     pwd_loc = (By.XPATH, '//input[@placeholder="请输入密码"]')
    12     # 登录按钮
    13     btn_loc = (By.XPATH, '//button[contains(@class,"primary")]')
    14     # 登录区域错误提示框
    15     error_tips_from_login_erea = (By.XPATH,'//div[@class="el-message el-message--error"]//p')

    home_page_locs

    1 """
    2 主页面元素定位
    3 """
    4 
    5 from selenium.webdriver.common.by import By
    6 
    7 class HomePageLocs:
    8     # 任务管理定位
    9     assign_loc = (By.XPATH, '//span[@title="任务管理"]')

    pageObjects:

    login_page

     1 """
     2 登录页面
     3 """
     4 from selenium.webdriver.remote.webdriver import WebDriver
     5 from selenium.webdriver.support.wait import WebDriverWait
     6 from selenium.webdriver.support import expected_conditions as EC
     7 
     8 from pageLocators.login_page_locs import LoginPageLocs as loc
     9 
    10 class LoginPage:
    11     # 属性-元素定位:直接从元素定位类中获取
    12 
    13     def __init__(self,driver:WebDriver):
    14         self.driver = driver
    15         self.wait = WebDriverWait(driver,20)
    16 
    17     # 用户名、密码登录
    18     def login(self,username,password):
    19         self.wait.until(EC.visibility_of_element_located(loc.btn_loc))
    20         self.driver.find_element(*loc.user_loc).send_keys(username)
    21         self.driver.find_element(*loc.pwd_loc).send_keys(password)
    22         btn_ele = self.driver.find_element(*loc.btn_loc)
    23         js_code = "arguments[0].click()"
    24         self.driver.execute_script(js_code,btn_ele)
    25 
    26     def get_error_msg_from_login_area(self):
    27         """
    28         登录失败时,获取登录区域的错误提示信息
    29         :return: 错误提示信息
    30         """
    31         self.wait.until(EC.visibility_of_element_located(loc.error_tips_from_login_erea))
    32         return self.driver.find_element(*loc.error_tips_from_login_erea).text

    home_page

     1 """
     2 首页
     3 """
     4 from selenium.webdriver.remote.webdriver import WebDriver
     5 from selenium.webdriver.support.wait import WebDriverWait
     6 from selenium.webdriver.support import expected_conditions as EC
     7 
     8 from pageLocators.home_page_locs import HomePageLocs as loc
     9 
    10 class HomePage:
    11 
    12     def __init__(self,driver:WebDriver):
    13         self.driver = driver
    14         self.wait = WebDriverWait(driver,20)
    15 
    16     def is_assign_exist(self):
    17         """
    18         如果存在则返回True,如果不存在,则返回false
    19         :return:
    20         """
    21         try:
    22             self.wait.until(EC.visibility_of_element_located(loc.assign_loc))
    23         except:
    24             return False
    25         else:
    26             return True

    testDatas:

    global_datas

    1 # 登录url
    2 login_url = "https://www.ketangpai.com/#/login"

    login_datas

     1 # 测试数据存放模块
     2 
     3 # 登录成功的测试数据
     4 valid_user = ("1522317xxxx","jyfxxxxxx")
     5 
     6 # 登录失败的测试数据
     7 """
     8 用户名为空/用户名不存在
     9 """
    10 invalid_datas = [
    11     {"username":"15223179492","password":"jyfxxxxxx","check":"用户不存在"},
    12     {"username":"","password":"jyfxxxxxx","check":"用户名不能为空"}
    13 ]

    testCases:

    test_login

     1 """
     2 登录页面测试
     3 """
     4 import pytest
     5 
     6 from pageObjects.login_page import LoginPage
     7 from pageObjects.home_page import HomePage
     8 from testDatas import login_datas as td
     9 
    10 @pytest.mark.usefixtures("back_login")
    11 class TestLogin:
    12 
    13     """
    14     逆向场景--登录失败(输入数据格式有误)
    15     """
    16     @pytest.mark.parametrize("case",td.invalid_datas)
    17     def test_login_failed_invalid_datas(self,case,back_login):
    18         LoginPage(back_login).login(case["username"],case["password"])
    19         assert LoginPage(back_login).get_error_msg_from_login_area() == case["check"]
    20 
    21     def test_login_success(self,back_login):
    22         LoginPage(back_login).login(*td.valid_user)
    23         assert HomePage(back_login).is_assign_exist()

    conftest.py  -- 前置后置

     1 from selenium import webdriver
     2 from testDatas import global_datas as gd
     3 from time import sleep
     4 import pytest
     5 
     6 # 前置后置--作用域和返回值
     7 # 作用域是类级别的,因此在进行自动化测试的过程中,浏览器只打开一次,可以节省测试时间
     8 @pytest.fixture(scope="class")
     9 def init():
    10     # 实例化driver,并访问课堂派登录页面
    11     driver = webdriver.Chrome()
    12     driver.get(gd.login_url)    # 从全局变量中获取登录url
    13     yield driver
    14     driver.quit()
    15 
    16 @pytest.fixture()
    17 def back_login(init):
    18     # 每次进行登录测试时,会重新返回登录页面进行登录,如果不重新返回登录页面,
    19     # 此时数据会有原有输入框的基础上进行追加,而不是我们期待的测试数据
    20     init.get(gd.login_url)
    21     yield init

    (3)测试结果

  • 相关阅读:
    p1706 全排列
    2089烤鸡(类似于选数问题)
    1036选数
    bfs
    A-E
    A-3
    百题A-2
    百题A-1
    二级概念题
    随记
  • 原文地址:https://www.cnblogs.com/yif930916/p/14803284.html
Copyright © 2011-2022 走看看