2024年csdn最新最全的web自动化测试思路及实战

news2024/10/6 6:46:22

Page Objects 设计模式

Page Objects概念:

  Page Objects是指UI界面上用于与用户进行交互的对象

pageobjects 设计模式概念:

  pageobjects 模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化时,需要改测试页面代码的情况。 当页面元素id变化时,只需要更改测试页Class中页面的属性即可。

  简单来讲,就是将代码以页面为单位进行组织,针对这个页面上的所有信息,相关操作都放到一个类中;从而使具体的测试用例变成了简单的调用和验证操作

pageobjects 设计模式:把页面设计成类,把页面上的控件作为属性,把控件的操作设计成方法;通过PO模式编写脚本,实现数据分离;

PO模式分层和线性脚本的比较:
线性脚本: 按操作识别元素,识别一个元素操作一个,风险比较小

page object模式模型: 要先全部识别元素后,然后再进行操作,

(比如在登录界面,要识别登录相关的元素后还要识别登录后界面的相关元素,但是按照po模式的方法无法定位登录后的元素所以会报元素识别失败的错误,故使用po模式要进行元素数据分离操作,可通过把元素信息放到excel或者yaml中;识别数据分离,实例化对象的时候不识别元素,操作的时候再去识别)

web自动化测试思路及实战

全部代码-Gitee: 

Web_Auto_Test_FrameWork: WEB自动化测试实战练习 (gitee.com)

前期准备工作:

1、 python  列表、字典、循环、面向对象 (python语言基础)

2、 python第三方模块的使用:

       os  time 、文件操作、日期查找、配置文件ini、log日志、excel (框架底层的工具)

3、selenium入门:驱动、浏览器、元素识别、元素操作(页面元素识别、元素操作)

4、unittest框架:(优化成4章)框架的流程、断言、忽略测试、构建套件、测试报告生成(测试用例层、执行层)

5. selenium+unittest实战:编写线性脚本框架,

6. 正式开始编写PO模式的UI自动化框架

 自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

pageobjects 设计模式

Page  Objects概念:        

          Page  Objects是指UI界面上用于与用户进行交互的对象

pageobjects 设计模式概念:

         pageobjects 模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化时,需要改测试页面代码的情况。 当页面元素id变化时,只需要更改测试页Class中页面的属性即可。

         简单来讲,就是将代码以页面为单位进行组织,针对这个页面上的所有信息,相关操作都放到一个类中;从而使具体的测试用例变成了简单的调用和验证操作

pageobjects 设计模式:把页面设计成类,把页面上的控件作为属性,把控件的操作设计成方法

类=属性+方法

以下是以关键字数据驱动框架做的实战项目

被测系统:禅道系统

框架01-pageobjects模型基础及应用

思路:

1. 新建一个元素信息包element_info,存放我们的页面

2. 新建webdriver驱动文件夹,导入浏览器的驱动文件

3. 新建login_page.py,添加属性、方法

4. 新建一个main_page.py

1.  在项目名下新建一个python的文件夹element_infos

新建Web_Auto_Test_Framework项目,在该项目的下面新建element_infos的py文件夹

2.  新建webdriver驱动文件夹,导入浏览器驱动文件

3.  在element_infos下新建login_page.py,添加属性、方法

前置条件下载selenium库:

代码示例:

 
# encoding: utf-8
# @author: Jeffrey
# @file: login_page.py
# @time: 2022/7/17 21:39
# @desc: 页面是类  控件:属性  控件操作:方法
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

current_path = os.path.dirname(__file__)
driver_path = os.path.join(current_path, '../webdriver/chromedriver.exe')


class LoginPage:

    def __init__(self):
        chrome_driver_path = Service(driver_path)
        self.driver = webdriver.Chrome(service=chrome_driver_path)
        self.driver.get('http://47.107.178.45/zentao/www/index.php?m=user&f=login')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

        # 控件:属性
        self.username_input = self.driver.find_element(By.XPATH,'//input[@name="account"]')
        self.password_input = self.driver.find_element(By.XPATH,'//input[@name="password"]')
        self.keep_login_box = self.driver.find_element(By.XPATH,'//input[@id="keepLoginon"]')
        self.login_button = self.driver.find_element(By.XPATH,'//button[@id="submit"]')


    # 输入用户名
    def input_username(self,username):
        self.username_input.send_keys(username)
    # 输入密码
    def input_password(self,password):
        self.password_input.send_keys(password)
    # 点击保持登录
    def keep_login(self):
        self.keep_login_box.click()
    # 点击登录按钮
    def click_login(self):
        self.login_button.click()



if __name__ == '__main__':
    loginpage = LoginPage()
    loginpage.input_username('test01')
    loginpage.input_password('newdream123')
    loginpage.click_login()

# 小结:页面=属性+方法
# 属性的命名:名称_元素类型
# 操作的命名:动作_元素名称

4.  新建一个main_page.py

思路:

1. 添加元素--属性

2. 添加动作--方法

3. 处理好driver,把login的driver 转给主页面

代码示例:

#第二个页面
# encoding: utf-8
# @author: Jeffrey
# @file: main_page.py
# @time: 2022/7/2 13:04
# @desc:
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from element_infos.login_page import LoginPage


class MainPage:

    def __init__(self):

        login_page = LoginPage()
        login_page.input_username('test01')
        login_page.input_password('newdream123')
        login_page.click_login()
        # 把登录页面的driver转移到main_page
        self.driver = login_page.driver

        self.companyname_showbox = self.driver.find_element(By.XPATH, '//h1[@id="companyname"]')
        self.myzone_menu = self.driver.find_element(By.XPATH, '//li[@data-id="my"]')
        self.product_menu = self.driver.find_element(By.XPATH, '//li[@data-id="product"]')
        self.username_showbox = self.driver.find_element(By.XPATH, '//span[@class="user-name"]')

    # 获取公司名称
    def get_companyname(self):
        value = self.companyname_showbox.get_attribute('title')
        return value

    # 选择我的地盘
    def goto_myzone(self):
        self.myzone_menu.click()

    # 选择我的产品
    def goto_product(self):
        self.product_menu.click()

    # 获取登录的用户名
    def get_username(self):
        value = self.username_showbox.text
        return value

if __name__ == '__main__':
    main_page = MainPage()
    print(main_page.get_username())

    # pageobject模式是实例化页面之后,需要识别所有的元素,然后再去操作,导致有些元素不能识别的问题;如下三个方法会报错,可参考框架02
    # print(main_page.get_companyname())
    # main_page.goto_myzone()
    # # main_page.goto_product()

5、新建common的py文件夹再添加日志封装log_utils.py

前置条件:在项目根目录下新建一个logs的文件夹

 

 总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1227517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

滑动窗口练习(一)— 固定窗口最大值问题

题目 假设一个固定大小为W的窗口,依次划过arr, 返回每一次滑出状况的最大值 例如,arr [4,3,5,4,3,3,6,7], W 3 返回:[5,5,5,4,6,7] 暴力对数器 暴力对数器方法主要是用来做校验,不在乎时间复杂度,逻辑上…

95. 最长公共子序列

题目 题解 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:# 定义状态:dp[i][j]表示s1[0:i]和s2[0:j]的最长公共子序列dp [[0 for j in range(len(text2)1)] for i in range(len(text1) 1)]# badcase: dp[i][0] 0, dp[0…

[C/C++]数据结构 LeetCode:用栈实现队列

题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返…

漫谈广告机制设计 | 万剑归宗:聊聊广告机制设计与收入提升的秘密(3)

​书接上文漫谈广告机制设计 | 万剑归宗:聊聊广告机制设计与收入提升的秘密(2),我们聊到囚徒困境是完全信息静态博弈,参与人存在占优策略,最终达到占优均衡,并且是对称占优均衡。接下来我们继续…

未来 20 年 12 大发展趋势

未来 20 年 12 大发展趋势 周末闲来无聊,翻阅以前的材料,常读常新的感觉。 前言 跟30年后的我们相比,现在的我们就是一无所知。必须要相信那些不可能的事情,因为我们尚处于第一天的第一个小时——开始的开始。 技术都会有一个…

SpringBoot——入门及原理

SpringBoot用来简化Spring应用开发,约定大于配置,去繁从简,是由Pivotal团队提供的全新框架。其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置(有特殊需求可以添加自己的配置覆盖默认配…

Unity 场景烘培 ——unity Post-Processing后处理1(四)

提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、Post-Processing是什么?二、安装使用Post-Processing1.安装Post-Processing2.使用Post-Processing(1).添加Post-process Volume&#xff08…

常用组合逻辑verilog实现之8-3优先编码器

文章目录 一、问题描述二、verilog源码三、综合及仿真结果一、问题描述 本例中将实现一个8-3优先编码器。优先编码器允许多个输入信号同时有效,输出针对优先级别高的信号进行编码。 8-3优先编码器有对应的芯片实现比如TI公司的CD4532,可以从下面链接下载其手册。 CD4532数…

【C++】入门三

接下来我们说一下引用这个概念,那么什么是引用呢?简单来说引用就是取别名,比如有一个变量叫a,现在我给它取了一个别名叫b,那么此时a和b管理的都是一块空间 这个例子就可以很好的体现a和b管理的是同一块空间&#xff0…

ClientDateSet:Cannot perform this operation on a closed dataset

一、问题表现 Delphi 三层DataSnap,使用AlphaControls控件优化界面,一窗口编辑时,出现下列错误提示: 编译通过,该窗口中,重新显示数据,下图: 相关代码: procedure…

fusion 360制作机械臂

参考教程:Industrial Robot ( PART - 5) - FUSION 360 TUTORIAL_哔哩哔哩_bilibili

Java,集合框架,关于Map接口与Collections工具类

目录 Map接口 Map及其实现类的对比: HashMap中元素的特点: 相关方法: 添加、修改操作: 删除操作: 元素查询的操作: 元视图操作的方法: TreeMap的使用: Properties类: Collections工具…

【React】React 基础

1. 搭建环境 npx create-react-app react-basic-demo2. 基本使用 JSX 中使用 {} 识别 JavaScript 中的表达式,比如变量、函数调用、方法调用等。 if、switch、变量声明等属于语句,不是表达式。 列表渲染使用 map 。 事件绑定用;on 事件名称…

OSG加载模型时显示读取进度

目录 1. 前言 2. 开发环境说明 3. 功能实现 3.1. 方法1 3.2. 方法2 3.3. 方法3 4. 附加说明 1. 前言 OSG中加载模型文件到视景器,一般通过osgDB::readXXXX系列开头的函数来加载模型,如:osgDB::readNodeFile、osgDB::readImageFile、os…

055-第三代软件开发-控制台输出彩虹日志

第三代软件开发-控制台输出彩虹日志 文章目录 第三代软件开发-控制台输出彩虹日志项目介绍控制台输出彩虹日志实现原理真实代码 总结 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QM…

MyBatis使用注解操作及XML操作

文章目录 1. 注解操作1.1 打印日志1.2 参数传递1.3 增(Insert)注意1:重命名注意2:返回主键 1.4 删(Delete)1.5 改(Update)1.6 查(Select)1. 配置,…

STM32串口重定向/实现不定长数据接收

STM32串口重定向/实现不定长数据接收 重定向MicroLIB 不定长数据接收 这是一期STM32内容代码分享,关于STM32重定向的代码和一些出现的问题吗,以及串口接收不定长数据思路 重定向 重定向的功能:能够在STM32中使用printf函数通过串口发送数据 …

最新版微信如何打开青少年模式?

最新版微信如何打开青少年模式? 1、将手机微信升级到最新版,并打开后点击底部我的进入; 2、在我的内,找到并点击设置进入; 3、在设置内找到青少年模式,并点击进入开启微信青少年模式; 原文来源…

【碰碰球】弹珠游戏-微信小程序项目开发流程详解

还记得小时候玩过的弹珠撞击游戏不,这里把它的实现原理通俗易懂地讲一下,看看怎样实现一个碰碰球(弹珠)小游戏,除了个人玩法,也可以双人玩哦,与打乒乓球一样的,可练习临场反应。 创建项目 打开微信开发者…

在线随机字符串生成工具

具体请前往:在线随机字符串生成器--通过该工具生成动态复杂随机密码,随机字符串等,加密盐等