当前位置: 首页 > news >正文

selenium 自动化测试——WebDriver API

控制浏览器

控制浏览器窗口大小:set_window_size()方法

设置全屏模式下运行:maximize_window()方法

from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.set_window_size(500, 500)
time.sleep(5)
driver.maximize_window()
time.sleep(5)
driver.quit()

控制浏览器前进、后退:back(),forward()方法

模拟浏览器刷新:driver.refresh()方法,模拟手动刷新(F5按键)

常用操作方法

  • clear() 清除文本
  • send_keys(value):模拟按键输入
  • click():单击元素
  • submit():提交表单(有些搜索框不提供搜索按钮,而是通过键盘按键回车完成搜索的提交,这时候可以通过submit来实现)
  • size:返回元素尺寸
  • text:获取元素文本
  • get_attribute(name):获取属性值
  • is_displayed():设置该元素是否用户可见
from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.find_element(By.ID,"kw").send_keys("hello")
driver.find_element(By.ID,"kw").clear()
driver.find_element(By.ID,"kw").send_keys("after")
ele = driver.find_element(By.ID,"su")
print("info: text:",ele.text, ";size:", ele.size)
driver.find_element(By.ID,"su").submit()
time.sleep(5)
driver.quit()

鼠标操作

webdriver中,与鼠标相关的操作都封装在ActionChains类中。

ActionChains类提供了常用的鼠标操作的方法:

  • perform():执行ActionChains类中存储的所有行为
  • context_click():右击
  • double_click():双击
  • drag_and_drop():拖动
  • move_to_element():鼠标悬停
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
time.sleep(5)
# 定位到要悬停的元素
above = driver.find_element(By.LINK_TEXT, '更多')
# 对定位到的元素执行悬停操作
ActionChains(driver).move_to_element(above).perform()  # perform 提交类中存储的行为
time.sleep(5)
driver.quit()

键盘操作

前面使用send_keys()来模拟键盘输入,还可以用它来模拟键盘上的按键,甚至是组合键,如Ctrl+a等

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import timedriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
time.sleep(5)driver.find_element(By.ID,"kw").send_keys("hello")
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "a")
time.sleep(5)
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "x")
time.sleep(5)
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "v")
time.sleep(5)
driver.find_element(By.ID,"su").submit()
time.sleep(5)
driver.quit()

常用验证信息获取

  • driver.title:获取当前页面的标题
  • driver.current_url:获取当前页面的url
  • driver.find_element(By.ID,’kw‘).text:获取当前元素的文本信息

设置元素等待

WebDriver提供了2中等待方式,显示等待和隐式等待

显示等待

显示等待是指WebDriver等待某一条件成立,则继续执行;否则在达到最大等待时间时抛出异常(TimeoutException)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timedriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
element = WebDriverWait(driver, 10, 0.5).until(EC.visibility_of_element_located((By.ID, "kw"))
)element.send_keys("hello")
driver.find_element(By.ID,"su").submit()
time.sleep(5)
driver.quit()

webdriverwait一般与until和until_not方法配合使用:

  • until():直到condition返回True
  • until_not():直到condition返回false

隐式等待

WebDriver 提供的implicitly_wait()方法可用来实现隐式等待,用法相对来说简单的多;

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
import timedriver = webdriver.Chrome()
driver.implicitly_wait(10)  # 隐式等待
try:driver.get("http://www.baidu.com")driver.maximize_window()driver.find_element(By.ID, "kw2").send_keys("hello")
except NoSuchElementException as e:print(e)
finally:driver.quit()

implicitly_wait()参数是秒。这个方法不是一个固定的等待,不影响脚本的执行速度;并且它会等待页面上所有元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行,否则,它将会以轮询的方式不断判断元素是否存在,直到达到设置的等待时间,还没有定位到元素,就会抛出异常。

定位一组元素

定位一组元素的方法与定位某个元素的方法非常像,唯一的区别就是单词element 后面多了一个’s',用来表示负数,使用方法与定位一个元素一样:

  • find_elements(By.ID, "kw")

多表单切换

在web 应用中会遇到frame/iframe表单嵌套页面的应用,webdriver 只能在一个页面上对元素进行识别和定位,这时候需要一driver.switch_to.frame()方法来切换到frame内嵌页面上。

from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("http://mail.163.com")
driver.maximize_window()
time.sleep(5)
login_frame = driver.find_element(By.CSS_SELECTOR,  "[id^=x-URS-iframe]")   # id后半部分的数字是随机的,因而采用css定位使用“^=”来匹配以xxx开头的元素。
driver.switch_to.frame(login_frame)
driver.find_element(By.NAME, "email").send_keys("wxjvv8")
driver.find_element(By.NAME, "password").send_keys("111111@")
driver.find_element(By.ID, "dologin").click()driver.switch_to.default_content()  # 最后通过switch_to.default_content()方法回到最外层的页面
driver.quit()

switch_to.frame()方法默认可以对表单的id属性或name属性传参,因而可以定位元素的对象。

多窗口切换

页面操作过程中,有时单击某个链接会跳转到新的窗口,这时就需要跳转到新的窗口进行操作。WebDriver提供 switch_to.window()方法来实现在不同窗口间的切换。

  • current_window_handle:获得当前窗口句柄
  • window_handles:返回所有窗口的句柄到当前会话
  • switch_to.window():切换到相应的窗口
from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.implicitly_wait(10)
# 获取当前窗口句柄
cur_handle = driver.current_window_handle
# 点击登录-注册,窗口跳转
driver.find_element(By.LINK_TEXT, "登录").click()
driver.find_element(By.LINK_TEXT, "立即注册").click()
all_handles = driver.window_handles
time.sleep(5)
# 返回百度搜索页面
for handle in all_handles:if handle != cur_handle:driver.switch_to.window(cur_handle)print("switch to", driver.title)
time.sleep(5)
driver.quit()

警告框处理

WebDriver处理JavaScript生成的alert、confirm、和prompt警告框的方法是 使用switch_to.alert()方法定位,然后使用下面的API操作:

  • text:返回警告框中的文字信息
  • accept():接受现有警告框
  • dismiss():解散现有警告框
  • send_keys():在警告框中输入文本(如果可以输入的话)
from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.implicitly_wait(10)
# 弹出警告框
driver.find_element(By.ID, "s-usersetting-top").click()
driver.find_element(By.CSS_SELECTOR, "#s-user-setting-menu > div > a.setpref.first > span").click()
driver.find_element(By.LINK_TEXT, "保存设置").click()
# 切换到警告框
alert = driver.switch_to.alert
# 获取警告框文本
print("alert text:",alert.text)
# 接受警告框
alert.accept()time.sleep(5)
driver.quit()

下拉框处理

WebDriver提供了Select类来处理下拉框

  • Select类:用于定位Select标签
  • select_by_value():通过value值来定位下拉选项
  • select_by_visible_text():通过text值来定位下拉选项
  • select_by_index():通过下拉选项的索引来定位,第一个选择项为0,第二个为1...
from time import sleep
from selenium import webdriver
from selenium.webdriver.support.select import Selectdri = webdriver.Chrome()dri.get('https://www.baidu.com')# 打开搜索设置
link = dri.find_element_by_link_text('设置').click()
dri.find_element_by_link_text('搜索设置').click()
sleep(2)# 搜索结果显示条数
sel = dri.find_element_by_xpath("//select[@id='nr']")# value = "20"
Select(sel).select_by_value('20')
sleep(2)# <option>每页显示50条</option>
Select(sel).select_by_visible_text("每页显示50条")
sleep(2)# 根据下拉选项的索引进行选择
Select(sel).select_by_index(0)
sleep(2)dri.quit()

上传文件

WebDriver没有提供专门用于上传的方法,要实现上传,关键在于思路。

在web页面中,一般点击上传,会打开本地windows窗口,从窗口选择文件进行上传。然而WebDriver无法控制windows控件,所以我们一般通过以下两种方式实现文件上传:

  • 普通上传:即将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器
  • 插件上传:一般指基于Flash、JavaScript或Ajax等技术实现的上传功能

下载文件

WebDriver 可以设置默认的下载路径,不同的浏览器设置的方式不同。

相关文章:

selenium 自动化测试——WebDriver API

控制浏览器 控制浏览器窗口大小&#xff1a;set_window_size()方法 设置全屏模式下运行&#xff1a;maximize_window()方法 from selenium import webdriver from selenium.webdriver.common.by import By import timedriver webdriver.Chrome() driver.get("http://w…...

【实战】学习 Electron:构建跨平台桌面应用

文章目录 一、Electron 简介二、Electron 的优势1. 学习曲线平缓2. 丰富的生态系统3. 跨平台支持4. 开源和社区支持 三、Electron 的使用1. 安装 Node.js2. 安装 Electron3. 创建项目4. 初始化项目5. 安装依赖6. 创建主进程文件7. 创建渲染进程文件8. 打包应用程序9. 运行应用程…...

Python开发之二维数组空缺值的近邻填充

Python开发之二维数组空缺值的填充 1 实现一&#xff0c;任意位置填充2 实现二&#xff0c;填充内部3 实现三&#xff0c;只填充边缘&#xff0c;不包括四个角 前言&#xff1a;主要实现二维数据里面某一个数据的缺失&#xff0c;用缺失的近邻数据进行均值填充&#xff0c;可以…...

vue使用pdf 导出当前页面,(jspdf, html2canvas )

需要安装两个插件 npm install html2canvas jspdfyarn add html2canvas jspdf<div class"app-container" id"pdfPage"><!--这个放你需要导出的内容--> </div><el-button size"mini" click"onExportPdf">导出…...

【oracle删除表 回滚操作】

oracle数据回滚 oracle表在被误删后&#xff0c;一定时间内&#xff0c;可以采取以下方法进行恢复: 1、先查询数据库当前时间 select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual;2、通过当前时间往前推时间&#xff0c;选择想要恢复的时间点 select * from 表名…...

Vue3 + TypeScript

Vue3 TS开发环境创建 1. 创建环境 vite除了支持基础阶段的纯TS环境之外&#xff0c;还支持 Vue TS开发环境的快速创建, 命令如下&#xff1a; $ npm create vitelatest vue-ts-pro -- --template vue-ts 说明&#xff1a; npm create vitelatest 基于最新版本的vite进行…...

软件测试/测试开发丨南科大计算机系本科生获“火焰杯”软件测试高校就业选拔赛一等奖

2022年12月2日&#xff0c;计算机系党总支书记、副系主任王琦副教授在工学院南楼551会议室为19级徐驰同学颁发第二届“火焰杯”软件测试开发选拔赛一等奖奖项&#xff0c;为刘烨庞助理教授颁发赛事优秀指导老师奖项。徐驰同学于2022年4月获得该赛事全国总决赛第一名&#xff0c…...

访问 github 问题解决方法

一、macOS版 PS. Windows 版的还没试&#xff0c;不过应该也差不多 1.基本信息 硬件&#xff1a;MacBook Pro 2017 (A1707) 系统&#xff1a;macOS 13.6 (Ventura) 应用&#xff1a;SwitchHosts 4.1.2 (Releases oldj/SwitchHosts GitHub) hosts内容网站&#xff1a;ht…...

供应QCA8075原装芯片

长期供应各品牌原装芯片&#xff1a; SST39VF040-70-4I-NH AR9344 DC3A BGA USB2422 QFN24 W9751G6KB-251 RTL8211EG-VB-CG HI3535-RBCV100 MX25L25635FMI-10G USB2240I-AEZG EM620FV8BS-70LF HXI15H4G160AF-13K 1PQ8064/BGA-519 USB4604I-1080HN SCB15H2G160A…...

在Maven中配置代理服务器的详细教程

在Maven中配置代理服务器的详细教程如下&#xff1a; 首先&#xff0c;确保您已经安装了Maven。创建一个新的Maven项目。在命令行中输入以下命令&#xff1a; mvn archetype:generate -DgroupIdcom.example -DartifactIdmy-app -DarchetypeArtifactIdmaven-archetype-quickst…...

QStringListModel

创建模型&#xff1a; QStringListModel* model new QStringListModel(this); 初始化列表&#xff1a; QStringList strList;strList << QStringLiteral("北京") << QStringLiteral("上海") << QStringLiteral("天津") &l…...

Linux下的文件管理

一、Linux下文件命名规则 1、可以使用哪些字符&#xff1f; 理论上除了字符“/”之外&#xff0c;所有的字符都可以使用&#xff0c;但是要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;例如&#xff0c; <、>、&#xff1f;、* …...

RN:报错info Opening flipper://null/React?device=React%20Native

背景 在 ios 上使用 debug 模式的时候&#xff0c;报错&#xff1a;info Opening flipper://null/React?deviceReact%20Native&#xff0c;我找到了这个 issue 其实也可以看到现在打开 debug&#xff0c;是 open debug&#xff0c;也不是之前的 debug for chrome 了&#xf…...

请问嵌入式或迁移学习要学什么?

请问嵌入式或迁移学习要学什么&#xff1f; 学习嵌入式和迁移学习是一个很好的方向&#xff0c;尤其是在军I领域。以下是一些你可以提前学习的基本 知识和步骤: 嵌入式系统:最近很多小伙伴找我&#xff0c;说想要一些嵌入式资料&#xff0c;然后我根据自己从业十年经验&#…...

数据结构-----图(Graph)论必知必会知识

目录 前言 图的基本概念 1.什么是图&#xff1f; 2 .图的相关术语 3 .有向图和无向图 4.简单图和多重图 5.连通图、强连通图、非连通图 6.权与网 7.子图和(强)连通分量 8.生成树和生成森林 前言 今天我们学习一种新的数据结构-----图&#xff0c;大家在日常生活中经常都…...

外汇天眼:法国金融市场管理局(AMF)致力于向零售投资者提供有关金融产品费用的信息

法国金融市场管理局&#xff08;AMF&#xff09;已经发布了一份专为专业人士准备的指南&#xff0c;以便他们使用更易于理解和比较的术语&#xff0c;以帮助客户更好地理解和比较费用。 AMF在其网站上推出了一个新的费用信息栏目&#xff0c;提供教育内容和工具&#xff0c;帮…...

【PythonGIS】基于Python批量合并矢量数据

老样子最近有项目需要将N个矢量文件合并成一个&#xff0c;总不能用ArcGIS一个个导入吧。所以我就想着用Python编个程序实现批量合并矢量。我之前也发了一些关于Python操作矢量数据的文章&#xff1a;【Python&GIS】Python处理矢量数据的基本操作&#xff08;查询、修改、删…...

精益求精:使用Ansible集中式自动备份核心数据

1、引言 在当今数字化时代&#xff0c;数据是企业和组织的核心资产。为了确保数据的安全性和可恢复性&#xff0c;备份是至关重 要的。然而&#xff0c;手动备份数据可能会繁琐且容易出错&#xff0c;特别是在面对大规模和分布式的数据存储情况下。幸运的是&#xff0c;Ansibl…...

大数据高级面试题

大数据高级面试题 Kafka的producer如何实现幂等性? Producer 幂等性 Producer 的幂等性指的是当发送同一条消息时&#xff0c;数据在 Server 端只会被持久化一次&#xff0c;数据不丟不重&#xff0c;但是这里的幂等性是有条件的&#xff1a; 只能保证 Producer 在单个会话内…...

如何拦截响应内容并修改响应头

背景及需求描述 背景 记录分享下近期遇到并解决的困扰了比较久的问题&#xff1a;在不同系统微信生态发现同一个cos地址用window.open(url)打开在苹果和安卓设备的微信生态上表现不一致&#xff1a;对于文档类型&#xff0c;响应头Content-Type: application/pdf 在安卓微信上…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...