Selenium自动化测试框架
一.Selenium概述
1.1 什么是框架?
框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的
结构用于去解决或者处理复杂的问题。
框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义
认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
框架,其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用
别人搭好的舞台,你来做表演。
1.2 为什么使用框架?
1)自己从头实现太复杂
2)使用框架能够更专注于业务逻辑,加快开发速度
3)框架的使用能够处理更多细节问题
4)使用人数多,稳定性,扩展性好
1.3 Selenium 工作原理

二.Selenium API基础
1.前提操作
(1)导入库
from selenium import webdriver
(2)创建浏览器对象
driver=webdriver.Chrome() #创建浏览器对象 谷歌浏览器
driver.get('https://www.baidu.com/') #访问网址 百度
2.方法
我们需要使用dir()来查看方法
print(dir(driver))
(1) 调整浏览器的尺寸
driver.maximize_window() #窗口最大化
print(driver.get_window_size()) #获取浏览器尺寸 {‘height’: 1020, ‘width’: 945}
driver.set_window_size(width=‘1200’,height=‘1000’) #设置浏览器尺寸
(2) 调整浏览器的位置
print(driver.get_window_position()) #获取浏览器位置 {'x': 10, 'y': 10}print(driver.set_window_position(100,100)) #设置浏览器位置
(3) 获取当前页面的url
print(driver.current_url) #https://www.baidu.com/
(4) 获取当前页面的title
print(driver.title) #百度一下,你就知道
(5) 刷新页面
driver.refresh()
(6) 返回上一页/下一页
driver.back() #上一页
driver.forward() #下一页
(7) 保存图片
#方式一:
data=driver.get_screenshot_as_png()
with open(‘111.jpg’,‘wb’) as f:
f.write(data)
#方式二:
driver.get_screenshot_as_file(‘222.jpg’)
(8) 查看网页源码
print(driver.page_source)
(9) 关闭网页
driver.close() #关闭当前页面
driver.quit() #关闭所有页面
3.元素定位
# 方式一: driver.find_element_by_xxx(value)
# 方式二:driver.find_element(By.xxx,value)
# 1.id
input=driver.find_element_by_id('kw')
input.send_keys(12306)
# 2.class
input=driver.find_element_by_class_name('s_ipt')
input.send_keys(12306)
# 3.name
input=driver.find_element_by_name('wd')
input.send_keys(12306)
# 4.xpath
input=driver.find_element_by_xpath('//*[@id="kw"]')
input.send_keys(12306)
# 5.css
input=driver.find_element_by_css_selector('#kw')
input.send_keys(12306)
# 6.link_text 全匹配
news=driver.find_element_by_link_text('新闻')
news.click()
# 7.partial_link_text 模糊匹配
news=driver.find_element_by_partial_link_text('闻')
news.click()
# 8.tag name 标签名
put=driver.find_element_by_tag_name("span")
put.click()
三.Selenium API高级
3.1 页面跳转
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://bj.58.com')
# 获取当前页面的句柄
h1=driver.window_handles
print('58同城:',h1)
# 定位元素 宠物
a=driver.find_element_by_link_text('宠物')
# 点击宠物
a.click()
# 获取点击跳转之后的句柄
h2=driver.window_handles
print('宠物:',h2)
# 跳转句柄
driver.switch_to.window(h2[1])
# 定位元素 宠物狗
dog=driver.find_element_by_xpath('/html/body/div[3]/div[1]/dl[1]/dd[1]/a/strong')
# dog=driver.find_element_by_link_text('宠物狗')
dog.click()
# 获取点击跳转之后的句柄
h3=driver.window_handles
print('宠物狗:',h3)
# 跳转句柄
driver.switch_to.window(h3[2])# 定位元素
small=driver.find_element_by_css_selector('#selection > dl:nth-child(1) > dd > a:nth-child(6)')
small.click()
3.2 表单跳转
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('https://qzone.qq.com/') #访问qq空间页面
driver.maximize_window() #窗口最大化#定位表单
frame=driver.find_element_by_id('login_frame')
# 表单跳转
driver.switch_to.frame(frame)
time.sleep(2)
# 点击密码登录
driver.find_element_by_link_text('密码登录').click()
time.sleep(2)
# 输入账号
driver.find_element_by_id('u').send_keys('1720003909')
time.sleep(2)
# 输入密码
driver.find_element_by_id('p').send_keys('xqy20001220')
time.sleep(2)
# 点击登录
driver.find_element_by_id('login_button').click()
# 关闭页面
driver.close()
3.3 弹出框操作
#进入弹出框driver.switch_to.alert
#接收警告accept()
#解散警告dismiss()
#发送文本到警告框send_keys(data)
代码:from selenium import webdriver
import timedriver=webdriver.Chrome()
driver.get('https://www.baidu.com/')# 定位 设置
set=driver.find_element_by_id('s-usersetting-top')
set.click()# 定位 搜索设置
search=driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]/span')
search.click()# 定位 每页20条
page=driver.find_element_by_xpath('/html/body/div[1]/div[6]/div/div/div/div[1]/form/div/ul/li[3]/span[2]/span[2]/label')
page.click()# 定位 保存设置
save=driver.find_element_by_css_selector('#se-setting-7 > a.prefpanelgo.setting-btn.c-btn.c-btn-primary')
save.click()time.sleep(2)
driver.switch_to.alert.accept() #弹框处理
# driver.switch_to.alert.dissmiss() #弹框处理
3.4 滚动条操作
from selenium import webdriver
import timedriver=webdriver.Chrome()
driver.get('http://bj.58.com')time.sleep(3)
# 滚动条到底部
# js="var q=document.documentElement.scrollTop=10000"
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js) #执行jstime.sleep(3)
# 顶部
js="window.scrollTo(0,0)"
driver.execute_script(js)time.sleep(3)
# 移动到指定元素
target = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[2]/div[2]/a[13]') #定位移动到的元素
driver.execute_script("arguments[0].scrollIntoView();", target)
target.click()
3.5 鼠标键盘操作
from selenium import webdriver
from selenium.webdriver import ActionChains #鼠标操作
from selenium.webdriver.common.keys import Keys #键盘操作
import timedriver=webdriver.Chrome()
driver.get('https://www.baidu.com/')# 定位元素 更多
more=driver.find_element_by_link_text('更多')#鼠标操作
ActionChains(driver).click(more).perform() #鼠标左击
ActionChains(driver).context_click(more).perform() #鼠标右击
ActionChains(driver).move_to_element(more).perform() #鼠标悬浮#键盘操作
srk = driver.find_element_by_id("kw")
srk.send_keys(12306)
time.sleep(2)
srk.send_keys(Keys.CONTROL,"a")
srk.send_keys(Keys.CONTROL,"x")
time.sleep(2)
srk.send_keys(Keys.CONTROL,'v')
3.6 下拉框操作
from selenium import webdriverdriver=webdriver.Chrome()
driver.get('https://www.baidu.com/')driver.maximize_window()# 定位元素 设置按钮
set=driver.find_element_by_id('s-usersetting-top')
set.click()# 定位元素 高级搜索
find=driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[2]/span')
find.click()# 定位元素 全部时间
time=driver.find_element_by_class_name('c-select-selected-value')
time.click()# 定位元素 最近一月
m=driver.find_elements_by_class_name('c-select-item')#方式一:
m[3].click()#方式二
for i in m:if i=='最近一月':i.click()
3.7 等待操作
(1)强制等待import time #强制等待:无论网络是否良好,必须等待对应的时间,才会执行下面的代码
time.sleep(3)
(2) 隐式等待driver.implicitly_wait(100) #隐式等待,当前界面的所有元素全部加载完成,才会执行下面的代码
(3) 显示等待from selenium.webdriver.support.wait import WebDriverWait #导入显性等待的包
from selenium.webdriver.support import expected_conditions as EC #判断所需要的元素是否已经被加载出来
from selenium.webdriver.common.by import By #定位# 定位元素 设置按钮
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,"s-usersetting-top")))
set=driver.find_element_by_id('s-usersetting-top')
set.click()
四.Selenium IDE
4.1 什么是Selenium IDE?
Selenium的IDE(集成开发环境)是一个易于使用的Firefox插件,用于开发Selenium测试案例。
它提供了一个图形用户界面,用于记录使用Firefox浏览器,用来学习和使用Selenium用户操作,
但它只能用于只用Firefox浏览器不支持其它浏览器
4.2 IDE功能简介

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:
Selenium自动化测试框架
一.Selenium概述 1.1 什么是框架? 框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的 结构用于去解决或者处理复杂的问题。 框架是整个或部分系统的可重用设计,表现为一组抽象构件及…...
C#实现观察者模式
观察者模式是一种软件设计模式,当一个对象的状态发生变化时,其所有依赖者都会自动得到通知。 观察者模式也被称为“发布-订阅”模式,它定义了对象之间的一对多的依赖性,当一个对象状态改变时,所有依赖于它的对象都会得…...
什么是持续部署
管理软件开发和部署有 3 种常见的方法:持续集成、持续交付,然后是持续部署。尽管它们经常被混淆,但它们是明显不同的。 正如您将在本文后面看到的,它们相互融合,并补充彼此的风格。但这篇文章并不是关于他们三个。今天…...
【Python】Loguru模块更简洁的日志记录库
Loguru: 更优雅的日志记录解决方案! loguru 是一个Python 简易且强大的第三方日志记录库,该库旨在通过添加一系列有用的功能来解决标准记录器的注意事项,从而减少 Python 日志记录的痛苦。 使用自带自带的 logging 模块的话,则需要…...
智慧环保:科技驱动下的环境保护新篇章
智慧环保:科技驱动下的环境保护新篇章 环境保护已经成为当今社会的重要议题,而科技的飞速发展为我们开启了智慧环保的新篇章。在这篇文章中,我们将介绍智慧环保所带来的机会和创新,以及科技在环境保护中的重要作用。 智慧环保的理…...
CTF-PWN环境搭建手册
工欲善其事必先利其器,作为一名CTF的pwn手,一定要有自己的专用解题环境。本文将详细记录kali下的pwn解题环境的安装过程,B站也会配备配套视频。 目录 安装前的准备工作 虚拟机环境编辑 VM版本安装教程 1. 下载Kali的VM虚拟机文件 2. 新…...
Nginx安装配置与SSL证书安装部署
一、Nginx Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内容。 nginx官网 这里下载nginx-1.24.0-zip Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内…...
高性能面试八股文之编译流程程序调度
1. C的编译流程 C语言程序的编译过程通常包括预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)四个主要阶段。下面是这些阶段的详细说明: 1.…...
opencv的MinGW-W64编译
最近使用Qt,需要用到opencv,安装详情参考下面这个网址,写的挺好: opencv的MinGW-W64编译 - 知乎 我电脑安装Qt中自带了MinGW,所以不需要像上面网址中的下载MinGw,只需要将Qt中自带的MinGW添加到环境变量即可,如&…...
在Go编程中调用外部命令的几种场景
1.摘要 在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库中, 专门提供了os/exec包来对调用外部程序提供支持, 本文将对调用外部命令的几种使用方法进行总…...
python学习:break用法详解
嗨喽,大家好呀~这里是爱看美女的茜茜呐 在执行while循环或者for循环时,只要循环条件满足,程序会一直执行循环体。 但在某些场景,我们希望在循环结束前就强制结束循环。 Python中有两种强制结束循环的方法: continue语…...
【算法萌新闯力扣】:找到所有数组中消失对数字
力扣热题:找到所有数组中消失对数字 开篇 这两天刚交了蓝桥杯的报名费,刷题的积极性高涨。算上打卡题,今天刷了10道算法题了,题目都比较简单,挑选了一道还不错的题目与大家分享。 题目链接:448.找到所有数组中消失对…...
Node.js 安装配置
文章目录 安装检测Node是否可用 安装 首先我们需要从官网下载Node安装包:Node.Js中文网,下载后双击安装没有什么特殊的地方,安装路径默认是C盘,不想安装C盘的话可以选择一下其他的盘符。安装完成以后可以不用配置环境变量,Node安装已经自动给…...
前端JS 使用input完成文件上传操作,并对文件进行类型转换
使用input实现文件上传 // 定义一个用于文件上传的按钮<input type"file" name"upload1" />// accept属性用于定义允许上传的文件类型, onchange用于绑定文件上传之后的相应函数<input type"file" name"upload2"…...
探索AI交互:Python与ChatGPT的完美结合!
大家好!我是爱摸鱼的小鸿,人生苦短,我用Python!关注我,收看技术干货。 随着人工智能的迅速发展,AI交互正成为技术领域的一大亮点。在这个过程中,Python编程语言和ChatGPT模型的结合展现出强大的…...
CI/CD - jenkins
目录 一、部署 1、简介 2、部署 二、配置 三、实时触发 四、自动化构建docker镜像 五、通过ssh插件交付任务 六、添加jenkins节点 七、RBAC 八、pipeline 九、jenkins结合ansible参数化构建 1、安装ansible 2、新建gitlab项目 3、jenkins新建项目playbook 一、部…...
【【萌新的SOC学习之 VDMA 彩条显示实验之一】】
萌新的SOC学习之 VDMA 彩条显示实验之一 实验任务 : 本章的实验任务是 PS写彩条数据至 DDR3 内存中 然后通过 VDMA IP核 将彩条数据显示在 RGB LCD 液晶屏上 下面是本次实验的系统框图 VDMA 通过 HP接口 与 PS端的 DDR 存储器 进行交互 因为 VDMA 出来的是 str…...
相机通用类之海康相机,软触发硬触发(飞拍),并输出halcon格式对象
//在此之前可以先浏览我编写的通用上位机类,更方便理解 https://blog.csdn.net/m0_51559565/article/details/134403745最近完成一个关于海康采图的demo,记录并说明用法。 先上代码。using System; using System.Collections.Generic; using System.Runt…...
linux时间调整
查看当前系统时间 [rootVM-12-12-centos ~]# date Sat Nov 18 16:09:11 CST 2023 Sat:表示星期六Saturday的缩写 Nov:表示十一月November的缩写 18:表示日期18号 16:09:11:时间 CST:China Standard Time中国标准…...
C++模版初阶
泛型编程 如下的交换函数中,它们只有类型的不同,应该怎么实现一个通用的交换函数呢? void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double temp…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
