自动化框架 Selenium 的使用

介绍

Selenium 是一个用于自动化 Web 浏览器的开源工具套件,主要用于 Web 应用程序测试,也可用于网页抓取和自动化 Web 任务。

早期的selenium RC已经被现在的webDriver所替代,可以简单的理解为selenium1.0+webdriver构成现在的Selenium2.0。现在我们说起selenium,一般指的是Selenium2.0。它有由Selenium IDE,Webdriver,Selenium Grid组成。

Selenium IDE

Selenium IDE一个用于Selenium测试的完成集成开发环境,可以直接录制在浏览器的用户操作,并且能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。录制的测试脚本可以以多种语言导出,比如java,C#PythonRuby等,方便掌握不同语言的测试人员操作。

Webdriver

Selenium RC 在浏览器中运行 JavaScript 应用,会存在环境沙箱问题,而WebDriver可以跳JavaScript的沙箱,针对不同的浏览器创建更健壮的,分布式的,跨平台的自动化测试脚本。基于特定语言(JavaC#PythonRubyPerlJavaScript等)绑定来驱动浏览器对Web元素进行操作和验证。

webdriver的工作原理

  • 启动浏览器后,webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的remote server
  • 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP requestbody中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。
  • Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。

Selenium Grid

selenium Grid是一个服务器,提供对浏览器实例访问的服务器列表,管理各个节点的注册和状态信息。可以实现在同一时刻不同服务器上执行不同的测试脚本,即可以分布式执行测试,支持并行跨浏览器测试​​​​​​,提高测试效率。

搭建自动化环境

安装驱动管理

WebDriver-Manager 是一个用于自动化管理 Web 驱动程序的工具库,它可以自动下载、配置和维护 Selenium WebDriver 所需的各种浏览器驱动(如 ChromeDriver、GeckoDriver、EdgeDriver 等),极大简化了自动化测试和 Web 应用程序开发中的驱动管理问题。

pip install webdriver-manager

安装selenium库

selenium版本很多,统⼀使⽤selenium 4.0.0版本
pip install selenium==4.0.0

新建一个项目,需要注意的是使用解释器时选择继承已有解释器的包,这样就可以在设置模块查看 python 解释器存在以上两个包,则可以新建一个文件运行以下代码来查看是否能正常运行。

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
#驱动程序管理的⾃动化
#创建驱动对象
#1.打开浏览器
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
#2.输⼊百度⽹址:https://www.baidu.com
driver.get("https://www.baidu.com")
#3、找到输⼊框并输⼊“迪丽热巴”
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪丽热巴")
#4、找到“百度⼀下”按钮并点击
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(5)
#5、关闭浏览器
driver.quit()

需要注意的是由于 ChromeDriver 的下载服务器(https://chromedriver.storage.googleapis.com)在国外,所以需要使用代理服务器才能正常运行。

常用函数的使用

元素的定位

find_element 是 Selenium WebDriver 中最常用的元素定位方法之一,用于在网页上查找并返回 第一个匹配 指定条件的元素。以下是详细介绍:

def find_element(self, by=By.ID, value=None) -> WebElement
  • 作用:查找并返回页面上 第一个 符合定位条件的元素。

  • 返回值:WebElement 对象(可直接操作,如点击、输入文本等)。

  • 异常:若未找到匹配元素,抛出 NoSuchElementException。

  • 定位方式:支持多种定位策略,通过 By 类指定:如 By.ID和 By.CSS_SELECTOR等。

示例代码

driver.find_element(By.CSS_SELECTOR,"#kw")

操作测试对象

点击/提交对象

click()
#找到百度⼀下按钮并点击
driver.find_element(By.CSS_SELECTOR, "#su").click()

模拟按键输⼊

send_keys("")
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴")

清除文本内容

输⼊⽂本后⼜想换⼀个新的关键词,这⾥就需要⽤到 clear()
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴")
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,"#kw").clear()
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("古⼒娜扎")

获取文本信息

如果判断获取到的元素对应的⽂本是否符合预期呢?获取元素对应的⽂本并打印⼀下~~
text=driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(1) > a").text
print(text)
问题:是否可以通过 text 获取到“百度⼀下按钮”上的文字“百度⼀下”呢?
注意:⽂本和属性值不要混淆了。获取属性值需要使⽤⽅法 get_attribute("属性名称") ;
text=driver.find_element(By.CSS_SELECTOR,"#su").get_attribute("value")
print(text)

获取当前页面标题

title
title = driver.title

获取当前页面URL

current_url
url = driver.current_url

窗⼝

打开⼀个新的⻚⾯之后获取到的title和URL仍然还是前⼀个⻚⾯的?
当我们⼿⼯测试的时候,我们可以通过眼睛来判断当前的窗⼝是什么,但对于程序来说它是不知道当前最新的窗⼝应该是哪⼀个。对于程序来说它怎么来识别每⼀个窗⼝呢?每个浏览器窗⼝都有⼀个唯⼀的属性句柄(handle)来表⽰,我们就可以通过句柄来切换。

切换窗口

1)获取当前⻚⾯句柄: driver.current_window_handle

2)获取所有⻚⾯句柄: driver.window_handles

3)切换当前句柄为最新⻚⾯:
curWindow = driver.current_window_handle
allWindows = driver.window_handles
for window in allWindows:if window != curWindow:driver.switch_to.window(window)
注意:执⾏了 driver.close() 之前需要切换到未被关闭的窗口

窗口设置大小

#窗⼝最⼤化
driver.maximize_window()
#窗⼝最⼩化
driver.minimize_window()
#窗⼝全屏
driver.fullscreen_window()
#⼿动设置窗⼝⼤⼩
driver.set_window_size(1024,768)

屏幕截图

我们的⾃动化脚本⼀般部署在机器上⾃动的去运⾏,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景
driver.save_screenshot('../images/image.png')
代码演⽰
#简单版本
driver.save_screenshot('../images/image.png')
#⾼阶版本
filename = "autotest-"+datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')+'.png'
driver.save_screenshot('../images/'+filename)

关闭窗⼝

driver.close()
注意:窗⼝关闭后driver要重新定义

弹窗

弹窗是在页面是找不到任何元素的,这种情况怎么处理?使⽤selenium提供的Alert接⼝
alert = driver.switchTo.alert
//确认
alert.accept()
//取消
alert.dismiss()

等待

通常代码执⾏的速度⽐页面渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可以使⽤selenium中提供的三种等待⽅法:

强制等待

time.sleep()
优点:使⽤简单,调试的时候⽐较有效
缺点:影响运⾏效率,浪费⼤量的时间

隐式等待

隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执⾏,直到超时没找到元素才会报错。
implicitly_wait() 参数:秒
⽰例:
#隐式等待5秒
driver.implicitly_wait(5)
隐式等待作⽤域是整个脚本的所有元素。即只要driver对象没有被释放掉( driver.quit() ),隐式等待就⼀直⽣效。
优点:智能等待,作⽤于全局

显式等待

显式等待也是⼀种智能等待,在指定超时时间范围内只要满⾜操作的条件就会继续执⾏后续代码
WebDriverWait(driver,sec).until(functions)
functions :涉及到selenium.support.ui.ExpectedConditions包下的 ExpectedConditions 类
由于写法复杂,这里不一一详细介绍

浏览器参数设置

设置无头模式

options = webdriver.ChromeOptions()
options.add_argument("-headless")
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),options=options)

页面加载策略

options.page_load_strategy = '加载⽅式'
⻚⾯加载⽅式主要有三种类型:
策略说明
normal
默认值, 等待所有资源下载
eager
DOM 访问已准备就绪, 但诸如图像的其他资源可能仍在加载
none
完全不会阻塞WebDriver
options = webdriver.ChromeOptions()
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),options=options)

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

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

相关文章

RAG深入了解P1:从RAG类型出发看优化点

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录引言1 RAG类型1.1 基础RAG (Naive/Standard RAG)1…

Llama 2:开放基础模型与微调聊天模型

温馨提示: 本篇文章已同步至"AI专题精讲" Llama 2:开放基础模型与微调聊天模型 摘要 在本研究中,我们开发并发布了 Llama 2,一组预训练和微调的大型语言模型(LLMs),其规模从 70 亿参…

微服务变更?自动化测试利器Parasoft SOAtest修复快、准、稳!

微服务架构凭借灵活和可扩展的优势越来越普及,但随之而来的变更也成了开发团队的“心头大患”。服务之间依赖复杂,接口改来改去,不仅让开发更费劲,还容易导致测试用例失效、测试效率下降,甚至埋下系统不稳的隐患。 自…

[Pytorch]深度学习-part1

一、Pytorch的安装1.1打开cmd1.2 输入nvidia-smi可以查看到CUDA Version的版本是12.7我们在安装的时候,需要注意,安装的cuda要小于等于我们电脑显示的CUDA版本1.3 (可选)卸载之前版本Pytorch通过上述方法,卸载之前安装…

day055-Dockerfile与常用指令

文章目录0. 老男孩思想-女性的第一需求1. Dockerfile1.1 Dockerfile的基本结构1.2 案例-制作小鸟飞飞镜像1.2.1 编写Dockerfile文件1.2.2 构建镜像1.2.3 启动容器1.3 Dockerfile常用指令1.4 面试题:Dockerfile中CMD和ENTRYPOINT的区别?1.5 案例-制作zrlo…

用 Ray 跨节点调用 GPU 部署 DeepSeek 大模型,实现分布式高效推理

在大模型时代,单节点 GPU 资源往往难以满足大模型(如 7B/13B 参数模型)的部署需求。借助 Ray 分布式框架,我们可以轻松实现跨节点 GPU 资源调度,让大模型在多节点间高效运行。本文将以 DeepSeek-llm-7B-Chat 模型为例&…

mysql 字符集不一致导致索引失效问题

mysql 字符集不一致导致索引失效问题 问题: 两张表,同一个字段,由于字符集不一致,导致虽然都有索引,在关联查询时,索引失效身份表 identity_info ,查询索引信息 show index from identity_info …

Qt/C++开发监控GB28181系统/视频点播没有ssrc问题的处理/兼容各种设备和应用场景需求

一、前言说明 搞监控拉流,如果仅仅是在开发机器,基本上每个程序员都能做到没有问题,把把都能正常运行,可是到了现场往往就容易掉链子,哪怕是你测试用过的一样的设备,所以必须不断的迭代代码,不…

论文Review 3DGS CITYGAUSSIAN

基本信息 题目:CityGaussian: Real-Time High-Quality Large-Scale Scene Rendering with Gaussians 来源:ECCV2024 学校:Institute of Automation, Chinese Academy of Sciences 是否开源:https://github.com/Linketic/Cit…

Debian-10,用glibc二进制预编译包,安装Mysql-5.7.44 笔记250716

Debian-10,用glibc二进制预编译包,安装Mysql-5.7.44 笔记250716 📦 一步脚本 #!/bin/bash### 安装依赖 apt install -y libaio1 libnuma1 libncurses5### 下载MySQL-5.7.44 的 glib二进制包: mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz ,(如果不存在) mkdir…

基于C#+SQlite开发(WinForm)个人日程管理系统

个人日程管理系统项目说明项目目标:我们要设计一款桌面应用版的综合性个人日程管理系统。它首先实现了日常管理的基本功能:待办事项的增删改查;其次,我们进行了更多功能的设计:番茄钟计时辅助工具,帮助用户…

Planning Agent:基于大模型的动态规划与ReAct机制,实现复杂问题自适应执行求解

引言 在当今数据驱动的商业环境中,企业面临着日益复杂的决策问题。传统的数据分析工具往往难以应对多步骤、多依赖的复杂问题求解。例如,当企业需要分析"北美市场 Q1-Q2 主要产品的销售增长趋势并识别关键驱动因素"时,传统工具可能…

《大数据技术原理与应用》实验报告七 熟悉 Spark 初级编程实践

目 录 一、实验目的 二、实验环境 三、实验内容与完成情况 3.1 Spark读取文件系统的数据。 3.2 编写独立应用程序实现数据去重。 3.3 编写独立应用程序实现求平局值问题。 四、问题和解决方法 五、心得体会 一、实验目的 1. 掌握使用 Spark 访问本地文件和 HDFS 文件的…

HOOPS SDK赋能PLM:打造全生命周期3D数据管理与协作能力

在制造业和工业领域,产品全生命周期管理(PLM) 已成为驱动企业数字化转型、提升创新力与运营效率的核心引擎。一个高效的PLM平台不仅需要管理海量的设计数据,还必须在设计、制造、供应链、销售和服务等多个环节之间无缝流转信息&am…

语雀编辑器内双击回车插入当前时间js脚本

打算多记录自己的想法,或者说灵感、念头 我想要的格式大概是这样的: 17:06 我写下第一个记录17:08 又一个想法18:38 又一个想法但是每次写时间都太麻烦了,想着能不能用程序或者脚本实现。 最终用脚本实现了: // UserScript // nam…

【深度学习】神经网络过拟合与欠拟合-part5

八、过拟合与欠拟合训练深层神经网络时,由于模型参数较多,数据不足的时候容易过拟合,正则化技术就是防止过拟合,提升模型的泛化能力和鲁棒性 (对新数据表现良好 对异常数据表现良好)1、概念1.1过拟合在训练…

SpringMVC3

一、JSON 与参数传递1.1JSON 是什么- JSON 是字符串:比如 {"name":"zhangsan","password":"123456","age":15} 就是一个 JSON 字符串,它用来在前后端、服务间传递数据。- JSON 库:Fastj…

小白学Python,网络爬虫篇(2)——selenium库

前言 selenium 库是一种用于 Web 应用程序测试的工具,它可以驱动浏览器执行特定操作,自动按照脚本代码做出单击、输入、打开、验证等操作,支持的浏览器包括 IE、Firefox、Safari、Chrome、Opera 等。 与 requests 库不同的是,se…

【Python】通过cmd的shell命令获取局域网内所有IP、MAC地址,通过主机名获取IP

【Python】通过cmd的shell命令获取局域网内所有IP、MAC地址,通过主机名获取IP 更新以gitee为准: gitee 文章目录cmd命令获取IPping主机名获取IP的主机名socket获取当前网关运行效果附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总…

【Echarts】 电影票房汇总实时数据横向柱状图比图

效果图code <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>圆角柱状图</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script> </head> <…