day19——web自动化测试(1)
【没有所谓的运气🍬,只有绝对的努力✊】
目录
1、什么是自动化
1.1 概念:
1.2 优点:
2、什么是自动化测试
2.1 自动化测试能解决什么问题?
2.1.1 优点:
2.1.2 误区:
2.2 自动化测试分类
3、web自动化测试
3.1 什么web项目适合做自动化测试?
3.2 【面试题】web自动化测试在什么阶段开始?
3.3 web自动化测试所属分类?
3.4 主流的web自动化测试工具
4、Selenium
4.1 什么是Selenium呢?
4.2 Selenium 特点
4.3 Selenium发展史
4.4 Selenium 安装和卸载
4.4.1 环境搭建
4.4.2 安装Selenium包
4.4.3 浏览器安装驱动
【火狐浏览器】
【谷歌浏览器】
4.4.4 安装查看此文章
4.4.5 案例
5、Selenium4源码解析
6、元素定位方式(8种)
6.1 By.ID
6.2 By.CLASS_NAME
6.3 By.TAG_NAME
6.4 By.NAME
6.5 LINK_TEXT 和 PARTIAL_LINK_TEXT
6.6 CSS_SELECTOR(推荐!!速度快,查找效率高)
6.6.2 黑马
6.7 XPATH
6.7.1 XPath定位策略(方式)
(1)路径——定位(2)利用元素属性——定位(3)属性与逻辑结合——定位(4)层级与属性结合——定位
7、不同元素定位实战
7.1 radio 单选框
7.2 chechbox


1、什么是自动化
1.1 概念:
由机器设备代替人工自动完成指定目标的过程。
1.2 优点:
(1)减少人工劳动力。
(2)提高工作效率。
(3)产品规格统一标准。
(4)规模化(批量生产)
2、什么是自动化测试
软件测试:校验系统是否满足规定的需求、弄清预期结果与实际结果之间的差别。
概念:让程序代替人工去验证系统功能的过程。
自动化测试包括很多:web自动化等。
2.1 自动化测试能解决什么问题?
- 解决——回归测试
- 解决——压力测试
- 解决——兼容性测试
- 提高测试效率,保证产品质量。
2.1.1 优点:
- 较少的时间内运行更多的测试用例。
- 自动化脚本可重复运行
- 减少人为的错误。
- 克服手工测试的局限性。
2.1.2 误区:
- 自动化测试可以完全替代手工测试。❌
- 自动化测试一定比手工测试厉害。❌
- 自动化测试可以发掘更多的bug。❌
- 自动化测试适用所有功能。❌
2.2 自动化测试分类
- web——自动化测试(selenium)
- 移动——自动化测试
- 接口——自动化测试(基于工具、基于代码)
- 单元测试——自动化测试。
3、web自动化测试
概念:让程序代替人工自动验证web项目功能的过程。
3.1 什么web项目适合做自动化测试?
- 需求变动不频繁。
- 项目周期长。
- 项目需要回归测试。
3.2 【面试题】web自动化测试在什么阶段开始?
答:功能测试完毕(手工测试)
3.3 web自动化测试所属分类?
- 黑盒测试(功能测试)
- 白盒测试(单元测试)
- 灰盒测试(接口测试)
web自动化测试属于 黑盒测试(功能测试)。
3.4 主流的web自动化测试工具
(1)QTP:一个商业化的功能测试工具,收费、支持web,桌面自动化测试。
(2)Selenium:开源的web自动化测试工具,免费、主要做功能测试。
(3)Robot framework:是一个基于python可扩展地关键字驱动的测试自动化框架。【2014年官网停止更新】
4、Selenium
4.1 什么是Selenium呢?
Selenium是一个用于web应用程序的自动化测试工具。
4.2 Selenium 特点
- 开源软件:源代码开放、可以根据需要来增加工具的某些功能。。
- 跨平台:linux、windows、mac
- 支持多种浏览器:Firefox、Chrome、IE、Edge、Opera、Safari等。
- 支持多种语言:python、java、C#、javascript、Ruby、PHP等。
- 成熟稳定:目前已被google、百度、腾讯等公司广泛使用。
- 功能强大:能够实现类似商业工具的大部分功能,因为开源性,可实现定制功能。
4.3 Selenium发展史

4.4 Selenium 安装和卸载
4.4.1 环境搭建
(1)python开发环境
(2)安装selenium包
(3)安装浏览器
(4)安装浏览器驱动。
4.4.2 安装Selenium包
安装:pip install selenium
卸载:pip uninstall selenium

4.4.3 浏览器安装驱动
【火狐浏览器】
https://github.com/mozilla/geckodriver/releases

【谷歌浏览器】
https://chromedriver.storage.googleapis.com/index.html
4.4.4 安装查看此文章
mac 上安装Selenium + 谷歌浏览器驱动 116.0.5845.x-CSDN博客
4.4.5 案例
import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开b站,输入 软件测试点击搜索按钮
"""
driver.get('https://www.bilibili.com')
driver.find_element(By.CLASS_NAME, "nav-search-input").send_keys("软件测试")
driver.find_element(By.CLASS_NAME, "nav-search-btn").click()time.sleep(3)
driver.quit()
5、Selenium4源码解析

6、元素定位方式(8种)

6.1 By.ID

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium点击搜索按钮
"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.baidu.com')
driver.find_element(By.ID, "kw").send_keys("Selenium")
driver.find_element(By.ID, "su").click()time.sleep(3)
driver.quit()
6.2 By.CLASS_NAME
import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium点击搜索按钮
"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.bilibili.com/')
driver.find_elements(By.CLASS_NAME, "channel-link")[1].click()for ele in driver.find_elements(By.CLASS_NAME, "channel-link"):print(ele.text)time.sleep(3)
driver.quit()
6.3 By.TAG_NAME
如果页面从存在多个tag_name ,只返回第一个元素。只适用于 <a>标签
import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.bilibili.com/')
driver.find_element(By.TAG_NAME, "input").send_keys("学习Selenium")time.sleep(3)
driver.quit()
6.4 By.NAME

6.5 LINK_TEXT 和 PARTIAL_LINK_TEXT
LINK_TEXT:只能定位a标签,定位元素内容必须为 全部匹配。
PARTIAL_LINK_TEXT:默认返回符合条件的第一个。
import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""需求:打开百度首页,输入 Selenium点击搜索按钮
"""
# 窗口最大化
driver.maximize_window()driver.get('https://www.baidu.com/')
# driver.find_element(By.LINK_TEXT, '新闻').click()
driver.find_element(By.PARTIAL_LINK_TEXT,"新闻").click()time.sleep(3)
driver.quit()
6.6 CSS_SELECTOR(推荐!!速度快,查找效率高)

import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""css selector
"""
# 窗口最大化
driver.maximize_window()# (1)根据id定位
# driver.get('https://www.baidu.com/')
# driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("你好")
# driver.find_element(By.CSS_SELECTOR, "#su").click()# (2)根据class属性值,定位
# driver.get("https://www.bilibili.com")
# driver.find_element(By.CSS_SELECTOR,".nav-search-input").send_keys("2025新年快乐")# (3)根据name属性值定位
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR,"[name='wd']").send_keys("软件测试111")# (4)根据标签属性定位
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href='https://wenku.baidu.com/?fr=bdpcindex']").click()# 模糊匹配——包含
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href*='wenku.baidu.com']").click()# 模糊匹配——匹配开头
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href^='https://wenku.baidu.com']").click()# 模糊匹配——匹配结尾
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "a[href$='wenku.baidu.com/?fr=bdpcindex']").click()# (5)组合定位
# driver.get("https://www.baidu.com")
# driver.find_element(By.CSS_SELECTOR, "input.s_ipt").send_keys("今日天气")time.sleep(3)
driver.quit()

6.6.2 黑马
(1)id选择器(2)class选择器(3)元素选择器(4)属性选择器(5)层级选择器

6.7 XPATH




6.7.1 XPath定位策略(方式)
(1)路径——定位(2)利用元素属性——定位(3)属性与逻辑结合——定位(4)层级与属性结合——定位


import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import Byoptions = webdriver.ChromeOptions()
service = ChromeService(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(options, service)"""xpath
"""
# 窗口最大化
driver.maximize_window()driver.get("https://passport.jd.com/new/login.aspx?ReturnUrl=http%3A%2F%2Fcart.jd.com%2Fcart.action%3Fnull")# driver.find_element(By.XPATH, "//input[@id='loginname']").send_keys('12345')
# driver.find_element(By.XPATH, "//*[text()='手机扫码安全登录']")
# driver.find_element(By.XPATH, "//*[contains(@autocomplete,'off')]")
driver.find_element(By.XPATH, "//*[starts-with(@href,'//about')]")time.sleep(3)
driver.quit()
7、不同元素定位实战

7.1 radio 单选框
练习地址:https://www.iviewui.com/view-ui-plus/component/form/radio
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from time import sleep
from selenium.webdriver.common.by import By# 设置正确的驱动路径
service = ChromeService(executable_path="/usr/local/bin/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)"""# 打开一个网站,点击radio """
driver.get("https://www.iviewui.com/view-ui-plus/component/form/radio")
# 方法1 :
# driver.find_element(By.XPATH, '//span[text()="Apple"]').click()
# sleep(1)
# driver.find_element(By.XPATH, '//span[text()="Android"]').click()
# sleep(1)
# driver.find_element(By.XPATH, '//span[text()="Windows"]').click()# 方法2:
# driver.find_elements(By.XPATH, '//input[@class="ivu-radio-input" and @type="radio"]')[1].click()
# sleep(1)
# driver.find_elements(By.XPATH, '//input[@class="ivu-radio-input" and @type="radio"]')[2].click()
# sleep(1)
# driver.find_elements(By.XPATH, '//input[@class="ivu-radio-input" and @type="radio"]')[3].click()# 方法3:
driver.find_element(By.XPATH, "//span[text()='Windows']/preceding-sibling::span/input").click()
sleep(1)sleep(3) # 打开页面,3秒后再关闭
# 关闭浏览器
driver.quit()
7.2 chechbox
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from time import sleep
from selenium.webdriver.common.by import By# 设置正确的驱动路径
service = ChromeService(executable_path="/usr/local/bin/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)"""# 打开一个网站,点击 checkbox """
driver.get("https://www.iviewui.com/view-ui-plus/component/form/checkbox")
# 方法1
# driver.find_element(By.XPATH, "//span[text()='香蕉']").click()
# sleep(1)
# driver.find_element(By.XPATH, "//span[text()='苹果']").click()
# sleep(1)
# driver.find_element(By.XPATH, "//span[text()='西瓜']").click()# 方法2:
driver.find_element(By.XPATH, "//span[text()='西瓜']/preceding-sibling::span/input").click()
sleep(1)sleep(3) # 打开页面,3秒后再关闭
# 关闭浏览器
driver.quit()
相关文章:
day19——web自动化测试(1)
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、什么是自动化 1.1 概念: 1.2 优点: 2、什么是自动化测试 2.1 自动化测试能解决什么问题? 2.1.1 优点: 2.1.2 误区: 2.2 自动化测试分类…...
go window安装protoc protoc生成protobuf文件
1. 下载: Releases protocolbuffers/protobuf GitHub 2. 解压缩: 3. 配置环境变量: 选择系统变量->Path -> 新增 解压缩后的bin路径 4. 打印版本: protoc --version 5. 安装protoc-gen-go cmd 下输入安装命令࿰…...
微信小程序中momentjs无法切换中文问题处理
微信小程序中momentj.s无法切换中文问题处理. 表现为 使用 locale(“zh-cn”)无效。 处理方法 # 1、先删除 miniprogram_npm\moment\index.js # 2、将 node_modules\moment\min\moment-with-locales.min.js 复制到 miniprogram_npm\moment下 并重命名为index.js # 3、修改mi…...
数据结构:链表
链表是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含两个部分:数据域和指针域。数据域用于存储数据元素的值,而指针域则用于指向链表中的下一个节点。这种结构使得链表能够动态地进行插入和删…...
领克Z20结合AI技术,革新自动驾驶辅助系统
眼瞅着,再有不到 5 个星期,春节就要热热闹闹地登场啦!对于在外辛苦打拼了一整年的打工人而言,回家过年可不就是这一年里心心念念、最最期盼的高光时刻嘛。这不,这几天各地的高速公路愈发熙熙攘攘起来,川流不…...
vector快慢指针+例题详解
1.快慢指针 例题 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从…...
重温设计模式--1、组合模式
文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...
单片机:实现SYN6288语音播报(附带源码)
单片机实现SYN6288语音播报 SYN6288是一款广泛应用于语音合成的IC,可以通过串口与单片机(如51系列、STM32等)进行通信,实现场景化的语音播报。通过连接外部存储设备(如SD卡)存储语音文件或直接通过内部语音…...
cookie,session,token 的区别
解决什么问题?Cookie(客户端存储)问题来了 Session(会话)解决的问题问题来了 token(令牌)解决的问题问题:token是无状态的如何解决? 解决什么问题? 解决http无状态的问题,说简单点就是用户身份的验证 举个例子: 张三在银行里…...
基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南
在数字化时代,视频内容已成为信息传播的重要载体。然而,为视频添加字幕却是一项繁琐且耗时的工作。幸运的是,随着人工智能技术的飞速发展,特别是OpenAI Whisper模型的推出,我们有了更加高效、智能的解决方案。 一、Op…...
物理学天空的两朵乌云——量子论与相对论
物理学天空的两朵乌云——量子论与相对论 爱因斯坦的青春与科学的辉煌起点 提到爱因斯坦,我们往往会联想到一个经典的形象——乱糟糟的头发,叼着烟斗,脸上满是岁月的皱纹。然而,这张深入人心的照片并不是他科学创造力的象征。实…...
聚类之轮廓系数
Silhouette Score(轮廓系数)是用于评估聚类质量的指标之一。它衡量了数据点与同簇内其他点的相似度以及与最近簇的相似度之间的对比。 公式 对于一个数据点 i: a(i): 数据点 i 到同簇内其他点的平均距离(簇内不相似度ÿ…...
Jenkins 构建流水线
在 Linux 系统上安装 Jenkins 服务,以及配置自动化构建项目 前置准备环境:docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 (1)拉取镜像 # 安装镜像包,默认安装最新版本 docker pull jenkins/jen…...
RTK部分模糊度固定测量流程图
部分模糊度剔除常用测量: 周跳或失锁时间优先剔除;按俯仰角剔除;按浮点模糊度协方差大小剔除模糊度;按信号强度剔除卫星;...
力扣-数据结构-2【算法学习day.73】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…...
操作系统导论读书笔记
目录 虚拟化抽象:进程抽象:进程概念 虚拟化 抽象:进程 本章讨论操作系统提供的基本的抽象—— 进程。进程的非正式定义非常简单:进程就是运行中的程序。程序本身是没有生命周期的,它只是存在磁盘上面的一些指令&…...
基于3D-Speaker进行区分说话人项目搭建过程报错记录 | 通话录音说话人区分以及语音识别 | 声纹识别以及语音识别 | pyannote-audio
0. 研究背景 在外呼系统中,我们的后台管理系统通常要对电话录音的内容进行提取和分析。那么说到分析,我们就要对录音中的两个人的对话进行分离,然后分别分析,比如分析客户是否有合作的意愿,分析客服讲的话术是否合理&…...
如何使用流式渲染技术提升用户体验
提示:记录工作中遇到的需求及解决办法 文章目录 什么是流式渲染?Node.js 实现简单流式渲染声明式 Shadow DOM,不依赖 javascript 实现react 实现流式渲染总结提示:以下是本篇文章正文内容,下面案例可供参考 什么是流式渲染? 流式渲染主要思想是将HTML文档分块(chunk)…...
【接口自动化连载】使用yaml配置文件自动生成接口case
直接上干货撸代码,有一些是通用的工具类代码,一次性封装永久使用,期待大家的关注,一起加油!!! 配置文件 根据不同的业务需求进行配置,例如Goods服务、Order服务分开配置࿰…...
前端安全 常见的攻击类型及防御措施
1. 跨站脚本攻击(XSS) 描述:跨站脚本(XSS:Cross-Site Scripting)是一种安全漏洞,允许攻击者向网站注入恶意客户端代码。该代码由受害者执行从而让攻击者绕过访问控制并冒充用户。XSS攻击可以分…...
如何针对不同行业制定SEO策略方案
如何针对不同行业制定SEO策略方案 在当今数字化时代,搜索引擎优化(SEO)已经成为每个企业线上推广的核心策略之一。不同行业的SEO策略并非一成不变。制定有效的SEO方案,需要对各个行业的特点、用户行为以及竞争态势有深刻的理解。…...
从Polling到DAQ:在ASAP2 Studio里提前配置XCP测量通道,提升CANape数据采集效率
从Polling到DAQ:在ASAP2 Studio里提前配置XCP测量通道,提升CANape数据采集效率 在汽车电控测试领域,数据采集的效率和精度直接影响着开发周期和标定质量。传统轮询方式(Polling)虽然简单易用,但面对现代ECU…...
PyTorch 3.0静态图分布式训练落地实录:从torch.compile到DistributedGraphExecutor的7个关键配置节点
第一章:PyTorch 3.0静态图分布式训练全景概览PyTorch 3.0 引入了原生静态图编译能力(TorchDynamo Inductor 后端深度集成),结合 torch.distributed 的增强型 API,构建出面向大规模集群的高性能分布式训练范式。与传统…...
如何利用SQL嵌套查询进行数据去重_配合窗口函数
用 ROW_NUMBER() 去重最稳,核心是 PARTITION BY 分组 ORDER BY 排序后取 rn 1;DISTINCT 对整行判重无效,GROUP BY 聚合易错配字段,窗口函数确保整行一致性。用 ROW_NUMBER() 做去重最稳,别碰 DISTINCT 套子查询嵌套查…...
基于多目标哈里斯鹰算法及模型预测控制(MPC)的储能和风电平抑波动研究(Matlab代码实现)
👨🎓个人主页 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰&a…...
Microsoft Agent Framework + Kimi API 实战:控制台应用跑通单次与多轮 Agent 对话
使用 Kimi 的 OpenAI 兼容接口实现单次对话实现多轮对话(基于 Session 保留上下文)你把代码复制后,只要配置好 KIMI_API_KEY 就能跑起来。环境准备.NET SDK 9.0Kimi API Key一个控制台项目创建项目并安装依赖:dotnet new console …...
QT: 二维码生成与自定义渲染实战
1. 二维码基础与QT开发环境搭建 二维码本质上是用黑白矩形图案表示二进制数据的图形化编码方案。相比传统条形码,它的核心优势在于二维方向上的数据存储能力,以及强大的容错机制。我在实际项目中发现,即使用户拍摄的二维码有部分污损或遮挡&a…...
1984-2024年中国10米分辨率城市土地利用栅格数据(商业、公服、居住等9类)
城市土地利用是刻画城市扩张与功能空间演化的重要基础信息。长时序、高分辨率且具有跨期可比性的城市土地利用数据,已成为城市扩张诊断、空间结构演化研究、国土空间规划评估与生态环境效应分析的重要支撑。而现有城市土地利用数据往往存在时间跨度不足、历史时期分…...
Dockerfile从零入门:手把手教你打包Node.js应用,解决镜像构建的常见坑
代码写完了,在本地跑得好好的,怎么把它打包成Docker镜像,部署到服务器上?答案就是Dockerfile。今天这篇文章,我们用Node.js应用做例子,从零开始写一个Dockerfile,把应用打包成镜像,顺…...
实用算法:布隆过滤器原理与手写实现,彻底解决缓存穿透
实用算法:布隆过滤器原理与手写实现,彻底解决缓存穿透 前言:在高并发系统中,缓存是提升性能的核心手段,但缓存穿透问题常常成为系统的“隐形杀手”——恶意请求不存在的Key,绕过缓存直接冲击数据库…...
