上线了做网站要钱/最新军事动态最新消息

上线了做网站要钱,最新军事动态最新消息,苹果园做网站的公司,上海市住房和城乡建设部网站官网目录: 浏览器复用Cookie 复用pageobject设计模式异常自动截图测试用例流程设计电子商务产品实战 1.浏览器复用 复用浏览器简介 为什么要学习复用浏览器? 自动化测试过程中,存在人为介入场景提高调试UI自动化测试脚本效率 复用已有浏览…

目录:

  1. 浏览器复用
  2. Cookie 复用
  3. pageobject设计模式
  4. 异常自动截图
  5. 测试用例流程设计
  6. 电子商务产品实战

1.浏览器复用

复用浏览器简介

 

为什么要学习复用浏览器?

  • 自动化测试过程中,存在人为介入场景
  • 提高调试UI自动化测试脚本效率
     

复用已有浏览器-配置步骤

  1. 需要退出当前所有的谷歌浏览器(特别注意)

  2. 输入启动命令,通过命令启动谷歌浏览器

    1. 找到 chrome 的启动路径
    2. 配置环境变量
  3. 验证是否启动成功

  • windows:chrome –remote-debugging-port=9222
  • mac:Google Chrome –remote-debugging-port=9222

 

 

 

 代码示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import Byoption = Options()option.debugger_address = 'localhost:9222'driver = webdriver.Chrome(options=option)driver.get("https://work.weixin.qq.com/wework_admin/frame")driver.find_element(By.CSS_SELECTOR,'.ww_indexImg_AddMember').click()

 2.Cookie 复用

cookie 是什么?

  • Cookie 是一些认证数据信息,存储在电脑的浏览器上
  • 当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息

 为什么要使用Cookie自动化登录?

  • 复用浏览器仍然在每次用例开始都需要人为介入
  • 若用例需要经常执行,复用浏览器则不是一个好的选择
  • 大部分cookie的时效性都很长,扫一次可以使用多次

  

 常见问题

  1. 企业微信cookie有互踢机制。在获取cookie成功之后。不要再进行扫码操作!!!!
  2. 获取cookie的时候,即执行代码获取cookie时,一定要确保已经登录
  3. 植入cookie之后需要进入登录页面,刷新验证是否自动登录成功。

 代码示例:

import timeimport yaml
from selenium import webdriverclass TestCookieLogin:def setup_class(self):self.drvier = webdriver.Chrome()self.drvier.implicitly_wait(3)def teardown_class(self):self.drvier.quit()def test_get_cookies(self):# 1. 访问企业微信主页/登录页面self.drvier.get("https://work.weixin.qq.com/wework_admin/frame#contacts")# 2. 等待20s,人工扫码操作time.sleep(15)# 3. 等成功登陆之后,再去获取cookie信息cookie = self.drvier.get_cookies()print(cookie)# 4. 将cookie存入一个可持久存储的地方,文件# 打开文件的时候添加写入权限with open("./datas/doc/cookie.yaml", "w") as f:# 第一个参数是要写入的数据yaml.safe_dump(cookie, f)def test_add_cookie(self):# 1. 访问企业微信主页面self.drvier.get("https://work.weixin.qq.com/wework_admin/frame#contacts")# 2. 定义cookie,cookie信息从已经写入的cookie文件中获取cookie = yaml.safe_load(open("./datas/doc/cookie.yaml"))# 3. 植入cookiefor c in cookie:self.drvier.add_cookie(c)time.sleep(3)# 4.再次访问企业微信页面,发现无需扫码自动登录,而且可以多次使用self.drvier.get("https://work.weixin.qq.com/wework_admin/frame#contacts")

代码结构:

  

3.pageobject设计模式

传统 UI 自动化的问题

  • 无法适应 UI 频繁变化
  • 无法清晰表达业务用例场景
  • 大量的样板代码 driver/find/click

POM 模式的优势

  • 降低 UI 变化导致的测试用例脆弱性问题
  • 让用例清晰明朗,与具体实现无关

 POM 建模原则

  • 字段意义
    • 不要暴露页面内部的元素给外部
    • 不需要建模 UI 内的所有元素
  • 方法意义
    • 用公共方法代表 UI 所提供的功能
    • 方法应该返回其他的 PageObject 或者返回用于断言的数据
    • 同样的行为不同的结果可以建模为不同的方法
    • 不要在方法内加断言

POM 使用方法

  • 把元素信息和操作细节封装到 PageObject 类中
  • 根据业务逻辑,在测试用例中链式调用

PO简介:

Page Object(简称PO)模式,是Selenium实战中最为流行,并且是自动化测试中最为熟悉和推崇的一种设计模式。在设计自动化测试时,把页面元素和元素的操作方法按照页面抽象出来,分离成一定的对象,然后再进行组织。做web自动化最头疼的一个问题,莫过于页面变化了,如果没有使用PO设计模式,页面一变化就意味着之前的元素定位甚至元素的操作方法不能用了,需要重新修改。你需要一个一个从测试脚本中把需要修改的元素定位方式、元素的操作方法找出来,然后一一地修改。这样的自动化脚本不但繁琐,维护成本也极高。

而page object模式就可以很好地解决这个问题,优点:

  1. 减少代码冗余。
  2. 业务和实现分离。
  3. 降低维护成本。

那到底什么是Page Object模式,见名知意,就是页面对象,在实际自动化测试中,一般对脚本分为三层:

  1. 对象层: 用于存放页面元素定位(object_layer)
  2. 逻辑层: 用于存放一些封装好的功能用例模块(logical_layer)
  3. 业务层: 用于存放我们真正的测试用例的操作部分(business_layer)

除了以上三层,还有一个基础层(base_layer),基础层主要是针对selenium的一些常用方法,根据实际业务需要进行二次封装,如点击、输入等操作加入一些等待、日志输入、截图等操作,方便以后查看脚本的运行情况及问题排查。

代码示例:(传统的测试方法)

test_tradition_search.py

from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestSearch:def setup_class(self):self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.implicitly_wait(3)def teardown_class(self):self.driver.quit()def test_search(self):self.driver.get("https://xueqiu.com/")# 输入搜索关键词self.driver.find_element(By.NAME, "q").send_keys("阿里巴巴-SW")# 点击搜索按钮self.driver.find_element(By.CSS_SELECTOR, "i.search").click()# 获取搜索结果name = self.driver.find_element(By.XPATH, "//table//strong").text# 断言assert name == "阿里巴巴-SW"

代码示例:(po模式) 

template: 用来存放开发模版 - Gitee.com

项目结构:

  

4.异常自动截图

实现原理

  • 装饰器
  • 自动化关键数据记录
    • 截图
    • 日志
    • page_source

代码示例:

 test_record_exception_zhuangshiqi.py

import timeimport allure
from selenium import webdriver
from selenium.webdriver.common.by import Byfrom web_automation_testing.first_web_automation_testing.utils.log_util import loggerdef ui_exception_record(func):def inner(*args, **kwargs):try:return func(*args, **kwargs)except Exception:logger.warning('执行过程发生异常!')driver = args[0].drivertimestamp = int(time.time())img_path = f"./datas/screenshot/image_{timestamp}.png"driver.save_screenshot(img_path)page_source_path = f"./datas/pagesource/page_source_{timestamp}.html"with open(page_source_path, 'w', encoding='utf8') as f:f.write(driver.page_source)allure.attach.file(img_path, name="picture", attachment_type=allure.attachment_type.PNG)allure.attach.file(page_source_path, name="pagesource", attachment_type=allure.attachment_type.TEXT)# allure.attach.file(page_source_path,name="pagesource",attachment_type=allure.attachment_type.HTML)raise Exceptionreturn innerclass TestRecord:def setup_class(self):self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.implicitly_wait(5)def teardown_class(self):self.driver.quit()@ui_exception_recorddef test_baidu(self):self.driver.get("https://www.baidu.com/")self.driver.find_element(By.ID, 'su1')

项目结构:

运行结果:

  

5.测试用例流程设计

现有测试用例的问题

  • 可维护性不高
  • 可读性较差
  • 稳定性较差

用例结构设计

  • 测试用例的编排
  • 测试用例的项目结构

web自动化测试-用例设计

类型框架对应作用
前置setup_class/BeforeAll准备测试数据
实例的初始化
setup/BeforeEach恢复用例初始状态
数据清理(也可以在用例级别完成)
后置teardown_class/AfterAlldriver进程退出
teardown/AfterEach恢复用例初始状态
数据清理(也可以在用例级别完成)

恢复用例初始状态

  1. 用例1 执行过程经过A->B->C 三个页面
  2. 用例2 执行过程经过A->B->C 三个页面
  3. 用例1 执行完成之后执行用例2

PlantUML diagram

PlantUML diagram

问题:单条用例执行完成之后如果不恢复下一条用例的开始状态(回复用例初始页面),则会影响下一条用例的执行。

  • 解决方案:
    • 每条用例执行完成都quit()(影响执行效率)
    • 封装一个方法,用例执行完成之后回到首页

数据清理

  • 清理策略
    • 在前置处理中执行
    • 在后置处理中执行
  • 清理方式
    • 调用业务接口
    • 通过UI自动化方式操作
    • 连接数据库执行SQL(不推荐)

6.电子商务产品实战

产品分析

  • 产品:Litemall商城系统
  • 功能:商品类目管理
  • litemall

测试用例-新增类目

  • 用户登录
  • 进入商品类目菜单
  • 点击添加
  • 创建商品类目
  • 获取操作结果
  • 断言测试结果

PlantUML diagram

测试用例-删除类目

  • 用户登录
  • 进入商品类目菜单
  • 点击添加
  • 创建商品类目
  • 点击删除
  • 获取操作结果
  • 断言测试结果

PlantUML diagram

代码示例:(传统示例)

test_tradition_litemall.py

import time
import allure
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from web_automation_testing.test_litemall_1.utils.log_util import loggerclass TestLitemall:# 前置动作def setup_class(self):self.driver = webdriver.Chrome()self.driver.implicitly_wait(3)# 登录self.driver.get("http://litemall.hogwarts.ceshiren.com/")# 问题,输入框内有默认值,此时send——keys不回清空只会追加# 解决方案: 在输入信息之前,先对输入框完成清空# 输入用户名密码self.driver.find_element(By.NAME, "username").clear()self.driver.find_element(By.NAME, "username").send_keys("manage")self.driver.find_element(By.NAME, "password").clear()self.driver.find_element(By.NAME, "password").send_keys("manage123")# 点击登录按钮self.driver.find_element(By.CSS_SELECTOR,".el-button--primary").click()# 窗口最大化self.driver.maximize_window()# 后置动作def teardown_class(self):self.driver.quit()def get_screen(self):timestamp = int(time.time())# 注意:!! 一定要提前创建好images 路径image_path = f"./datas/screenshot/image_{timestamp}.PNG"# 截图self.driver.save_screenshot(image_path)# 讲截图放到报告的数据中allure.attach.file(image_path, name="picture",attachment_type=allure.attachment_type.PNG)# 新增功能def test_add_type(self):# 点击商场管理/商品类目,进入商品类目页面# 进入商品类目页面self.driver.find_element(By.XPATH, "//*[text()='商场管理']").click()self.driver.find_element(By.XPATH, "//*[text()='商品类目']").click()# 添加商品类目操作self.driver.find_element(By.XPATH, "//*[text()='添加']").click()self.driver.find_element(By.CSS_SELECTOR,".el-input__inner").send_keys("新增商品测试")# ==============显示等待优化方案2: 自定义显式等待条件def click_exception(by, element, max_attempts=5):def _inner(driver):# 多次点击按钮actul_attempts = 0  # 实际点击次数while actul_attempts < max_attempts:# 进行点击操作actul_attempts += 1  # 每次循环,实际点击次数加1try:# 如果点击过程报错,则直接执行 except 逻辑,并切继续循环# 没有报错,则直接return 循环结束driver.find_element(by, element).click()return Trueexcept Exception:logger.debug("点击的时候出现了一次异常")# 当实际点击次数大于最大点击次数时,结束循环并抛出异常raise Exception("超出了最大点击次数")# return _inner() 错误写法return _innerWebDriverWait(self.driver, 10).until(click_exception(By.CSS_SELECTOR,".dialog-footer .el-button--primary"))# ===========================使用显式等待优化# 如果没找到,程序也不应该报错res = self.driver.find_elements(By.XPATH,"//*[text()='新增商品测试']")self.get_screen()# 数据的清理一定到放在断言操作之后完成,要不然可能会影响断言结果self.driver.find_element(By.XPATH,"//*[text()='新增商品测试']/../..//*[text()='删除']").click()logger.info(f"断言获取到的实际结果为{res}")# 断言产品新增后是否成功找到assert res != []# 删除功能def test_delete_type(self):# ================ 造数据步骤# 点击商场管理/商品类目,进入商品类目页面# 进入商品类目页面self.driver.find_element(By.XPATH, "//*[text()='商场管理']").click()self.driver.find_element(By.XPATH, "//*[text()='商品类目']").click()# 添加商品类目操作self.driver.find_element(By.XPATH, "//*[text()='添加']").click()self.driver.find_element(By.CSS_SELECTOR,".el-input__inner").send_keys("删除商品测试")ele = WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, ".dialog-footer .el-button--primary")))ele.click()# ============完成删除步骤self.driver.find_element(By.XPATH,"//*[text()='删除商品测试']/../..//*[text()='删除']").click()# 断言WebDriverWait(self.driver, 10).until_not(expected_conditions.visibility_of_any_elements_located((By.XPATH,"//*[text()='删除商品测试']")))# 问题: 因为代码执行速度过快,元素还未消失就捕获了。# 解决: 确认该元素不存在后,再捕获res = self.driver.find_elements(By.XPATH,"//*[text()='删除商品测试']")logger.info(f"断言获取到的实际结果为{res}")assert res == []

PO模式设计原则

  • 不要暴露页面内部的元素给外部
  • 不需要建模 UI 内的所有元素
  • 要用公共方法代表 UI 所提供的功能
  • 同样的行为不同的结果可以建模为不同的方法
  • 方法应该返回其他的 PageObject ,或者返回用于断言的数据
  • 不要在方法内加断言

PO模式改造

PlantUML diagram

 梳理业务操作流程

PlantUML diagram

 梳理前置和后置

代码示例:

template: 用来存放开发模版

项目结构:

  

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

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

相关文章

牛客网Verilog刷题 | 入门特别版本

文章目录 1、 VL1 输出12、VL2 wire连线3、 VL3 多wire连接4、VL4 反相器5、VL5 与门6、VL6 NOR 门7、VL7 XOR 门8、VL8 逻辑运算10、VL10 逻辑运算211、VL11 多位信号12、VL12 信号顺序调整13、VL13 位运算与逻辑运算14、VL14 对信号按位操作15、VL15 信号级联合并16、VL16 信…

Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息&#xff0c;B/S有的东西&#xff0c;C/S当然也可以有&#xff0c;就像QQ的消息提示一样&#xff01; 实现一个类似的东西并不困难&#xff0c;只要想明白原理实现起来就很简单了&#xff01; 实现原理&#xff1a; &#xff08;1&#…

在百度地图中添加自定义全屏控件

百度地图中添加全屏控件 前置知识&#xff1a; 进入整个页面的全屏模式 &#xff1a;document.documentElement.requestFullscreen() 进入特定元素的全屏模式 &#xff1a; document.getElementById("ID").requestFullscreen() 退出全屏&#xff1a;document.exitFu…

免费PPT素材网站,我推荐这6个

找PPT素材、模板&#xff0c;就上这6个网站&#xff0c;免费下载&#xff0c;建议收藏~ 菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYwNDUx 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒体类等素材都很丰富。PPT模板种类很多&…

leetcode76. 最小覆盖子串(滑动窗口-java)

滑动窗口 最小覆盖子串滑动窗口代码 上期经典 最小覆盖子串 难度 - 困难 原题链接 - 最小覆盖字串 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t…

金额千位符自定义指令

自定义指令文件 moneyFormat.js /*** v-money 金额千分位转换*/export default {inserted: inputFormatter({// 格式化函数formatter(num, util) {if(num null || num || num undefined || typeof(num) undefined){return }if(util 万元 || util 万){return formatMone…

客户案例:高性能、大规模、高可靠的AIGC承载网络

客户是一家AIGC领域的公司&#xff0c;他们通过构建一套完整的内容生产系统&#xff0c;革新内容创作过程&#xff0c;让用户以更低成本完成内容创作。 客户网络需求汇总 RoCE的计算网络RoCE存储网络1.不少于600端口200G以太网接入端口&#xff0c;未来可扩容至至少1280端口1.…

cuda面试准备(一),架构调试

1 cuda架构 硬件方面 SP (streaming Process) ,SM (streaming multiprocessor) 是硬件(GPUhardware) 概念。而thread,block,grid,warp是软件上的(CUDA) 概念 SP:最基本的处理单元,streaming processor,也称为CUDA core,最后具体的指令和任务都是在SP上处理的。GPU进行并行…

实验七 Linux 内核移植

【实验目的】 掌握 Linux 内核配置和编译的基本方法 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&#xff0c;以“#”开头的命令表 示在开发板下…

Docker常用操作命令(二)

Docker常用操作命令(二) 11、进入容器 docker exec -it 容器名称or容器ID /bin/bash [rootzch01 ~]# docker exec -it 973ff3caff19 /bin/bash 退出容器 root973ff3caff19:/# exit 12、查看容器中的进程 docker top 容器名称or容器ID [rootzch01 ~]# docker top 973ff3c…

centos7安装JDK

centos7安装JDK 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.安装 我这有包&#xff0c;需要了可以私发 #创建/data/jdkmkdir -p /data/jdk#jdk的安装包放到/data/jdk里#进入/data/jdkcd /data/jdk #解压tar -zxvf jdk-8u181-linux-x64.tar.gz #编辑环境变量vim /…

vue3 基础知识 ( webpack 基础知识)05

你好 文章目录 一、组件二、如何支持SFC三、webpack 打包工具四、webpack 依赖图五、webpack 代码分包 一、组件 使用组件中我们可以获得非常多的特性&#xff1a; 代码的高亮&#xff1b;ES6、CommonJS的模块化能力&#xff1b;组件作用域的CSS&#xff1b;可以使用预处理器来…

Oracle的学习心得和知识总结(二十七)|Oracle数据库数据库回放功能之论文一翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

JavaWeb-特殊文件(propertis与XML)

目录 Properties文件 一.properties介绍 二.properties使用 三.解决中文乱码问题 XML文件 一.XML介绍 二.XML文件的语法规则 三.XML的使用 Properties文件 一.properties介绍 1.什么是properties文件 Properties文件是一种常用的配置文件格式&#xff0c;用于存储键值…

怎么做用二维码收集数据?问卷码在线生成技巧

在收集用户信息时&#xff0c;一般会通过制作表单的方式&#xff0c;将问题整理处理&#xff0c;让用户选择或者填写&#xff0c;那么现在比较流行的一种方式就是将表单生成二维码&#xff0c;让他人可以通过扫码来填写表单数据。那么使用二维码生成器来制作表单二维码的方法相…

RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 模型的加载

文章目录 一、Caffe模型加载接口二、TensorFlow模型加载接口三、TensorFlowLite模型加载接口四、ONNX模型加载五、ONNX模型加载六、PyTorch模型加载接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 RKNN-Toolkit2 目前支持 Caffe、TensorFlow、TensorFlowLite、ONN…

Python代理池健壮性测试 - 压力测试和异常处理

大家好&#xff01;在构建一个可靠的Python代理池时&#xff0c;除了实现基本功能外&#xff0c;我们还需要进行一系列健壮性测试来确保其能够稳定运行&#xff0c;并具备应对各种异常情况的能力。本文将介绍如何使用压力测试工具以及合适的异常处理机制来提升Python代理池的可…

MySQL MVCC的详解之Read View

文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制2.2、源码 三、参考 概要 在上文中&#xff0c;我们提到了MVCC&#xff08;Multi-Version Concurrency Control)多版本并发控制&#xff0c;是通过undo log来实…

【校招VIP】TCP/IP模型之常用协议和端口

考点介绍&#xff1a; 大厂测试校招面试里经常会出现TCP/IP模型的考察&#xff0c;TCP/IP协议是网络基础知识&#xff0c;是互联网的基石&#xff0c;不管你是做开发、运维还是信息安全的&#xff0c;TCP/IP 协议都是你绕不过去的一环&#xff0c;程序员需要像学会看书写字一样…

element-ui中的el-table合并单元格

描述&#xff1a; 在写项目的时候有时候会经常遇到把行和列合并起来的情况&#xff0c;因为有些数据是重复渲染的&#xff0c;不合并行列会使表格看起来非常的混乱&#xff0c;如下&#xff1a; 而我们想要的数据是下面这种情况&#xff0c;将重复的行进行合并&#xff0c;使表…