Selenium介绍及基本使用方法

Selenium是一个开源、免费、简单、灵活,对Web浏览器支持良好的自动化测试工具,在UI自动化、爬虫等场景下是十分实用的,能够熟练掌握并使用Selenium工具可以大大的提高效率。

Selenium简介

Selenium支持多平台、多浏览器、多语言去实现自动化测试,是一个开源和可移植的Web测试框架,支持并行测试执行,从而减少了时间并提高了测试效率。利用它,我们可以编写相关的自动化程序,让程序完全像人一样在浏览器里面操作Web界面,比如模拟鼠标点击、模拟键盘输入等等。不但能够操作Web界面,还能从Web中获取信息,并且相对来说,使用Selenium来获取信息更加简单,它的基本原理是我们编写自动化程序之后利用浏览器驱动直接对浏览器进行操作,只要我们用户能在浏览器上获得的信息使用Selenium都可以获得。

环境准备

下载浏览器驱动,注意驱动版本与浏览器版本要一致

将浏览器驱动路径添加到环境变量path中

安装Selenium包pip install selenium

快速入门

使用selenium实现控制浏览器打开百度首页,搜索Alipay。

from selenium import webdriver # 导入webdriver
import time
driver = webdriver.Chrome() # 获取浏览器驱动
driver.get(" http://www.baidu.com") # 打开百度首页
input_box = driver.find_element_by_id('kw') # 获取首页输入框元素
input_box.send_keys('Alipay') # 向输入框中输入内容
search_button = driver.find_element_by_id('su') # 获取首页搜索按钮元素
search_button.click() # 点击搜索按钮
time.sleep(5)
driver.quit() # 关闭驱动

Selenium-API操作【文末免费分享Selenium自动化测试学习资源】

元素等待

显示等待

设置一个超时时间,每过一段时间就去检测一次该元素是否存在,如果存在则执行后续内容,如果超过最大时间(超时时间)则抛出超时异常(TimeoutException)。显示等待需要使用 WebDriverWait,同时配合 until 或 not until 。

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('Http://www.baidu.com')

# 每隔0.5秒检测一次元素存不存在,5秒内没找到抛出异常

element = WebDriverWait(driver, 5, 0.5).until(

expected_conditions.presence_of_element_located((By.ID, 'kd')), message='元素未找到')

隐式等待

隐式等待也是指定一个超时时间,如果超出这个时间指定元素还没有被加载出来,就会抛出 NoSuchElementException 异常。除了抛出的异常不同外,还有一点,隐式等待是全局性的,即运行过程中,如果元素可以定位到,它不会影响代码运行,但如果定位不到,则它会以轮询的方式不断地访问元素直到元素被找到,若超过指定时间,则抛出异常。使用 implicitly_wait() 来实现隐式等待,使用难度相对于显式等待要简单很多。

driver.implicitly_wait(5)

强制等待

使用 time.sleep() 强制等待,设置固定的休眠时间,等待元素加载,对于代码的运行效率会有影响。

元素定位

Selenium提供了8种基本元素定位的方法,分别是id,name,class name,tag name,link text,partial link text,xpath,css selector,其中id,name,class name,tag name是根据元素的标签或元素的属性来进行定位;link text,partial link text是根据超链接的文本来进行定位;xpath为元素路径定位;css为选择器定位(样式定位)。

element = driver.find_element_by_id('kw') # 通过id属性获取元素

element = driver.find_element_by_name('wd') # 通过name属性获取元素

element = driver.find_element_by_class_name('input') # 通过class属性获取元素

element = driver.find_element_by_tag_name('input') # 通过标签名获取元素

element = driver.find_element_by_link_text('视频') # 通过链接文本值获取元素

element = driver.find_element_by_partial_link_text('视')# 通过部分链接文本值获取元素

element = driver.find_element_by_xpath("//*[@id='kw']") # 通过Xpath获取元素

element = driver.find_element_by_css_selector('#kw') # 通过CSS选择器获取元素

元素操作

定位到元素获取到元素对象之后,就可以对元素进行我们想要的操作了,Selenium提供了许多API供我们操作元素,常用的操作有点击、输入、清除、获取元素坐标值、获取元素宽高值、元素属性值、检查元素是否被选中。

elemnet.click() # 点击元素

element.send_keys('武汉') # 输入内容

element.clear() # 清除内容

element.location.get('x') # 获取元素左上角X轴坐标

element.location.get('y') # 获取元素左上角Y轴坐标

element.size.get('width') # 获取元素宽度

element.size.get('height') # 获取元素高度

element.is_selected() # 元素是否被选中

鼠标操作

常见的鼠标操作有:点击、右击、双击、悬停、拖拽等,对于这些鼠标操作Selenium都封装了相应的操作方法

在Selenium中将操作鼠标的方法封装在ActionChains类中,在ActionChains类中所有提供的鼠标事件方法,在调用的时候所有的行为都存储在ActionChains对象中,而perform()方法就是真正去执行所有的鼠标事件。

from selenium.webdriver.common.action_chains import ActionChains # 导包

actionChains = ActionChains(driver) # 实例化ActionChains对象

actionChains.move_to_element(element).perform() # 鼠标悬停

actionChains.drag_and_drop(elementA, elementB).perform() # 鼠标拖拽

actionChains.context_click(element).perform() # 鼠标右击

actionChains.double_click(element).perform() # 鼠标双击

键盘操作

Selenium中把键盘的按键都封装在Keys类中, 模拟键盘上一些按键或者组合键的输入,使用send_Keys+http://Keys.XXX实现键盘上的组合按键如:Ctrl+C 、Ctrl+V。

from selenium.webdriver.common.keys import Keys # 导包

element.send_keys(Keys.BACK_SPACE) # 模拟按下退格键

element.send_keys(Keys.CONTROL, 'a') # 模拟按下Ctrl+A

element.send_keys(Keys.CONTROL, 'x') # 模拟按下Ctrl+X

element.send_keys(Keys.CONTROL, 'v') # 模拟按下Ctrl+V

浏览器操作

selenium同样提供了相应的API用于针对浏览器的操作,常用的有最大化浏览器窗口,设置浏览器窗口大小,设置浏览器的位置,控制浏览器前进后退,页面刷新。

driver.maximize_window() # 浏览器窗口最大化

driver.set_window_size(800, 800) # 浏览器窗口宽800 高800

driver.set_window_rect(300, 0) # 浏览器位置(300,0)

driver.back() # 浏览器后退

driver.forward() # 浏览器前进

driver.refresh() # 刷新页面

其他操作

标签页

driver.get_screenshot_as_file('./baidu.png') # 页面截图

driver.close() # 关闭当前标签页

driver.quit() # 关闭所有标签页

在某个页面点击链接打开了一个新的标签页,此时selenium是无法定位到新标签页的元素。这就涉及到句柄的概念了,句柄就是标签页对象的唯一标识,每个标签页都有自己的句柄,可以通过句柄来实现标签页的切换,从而定位到对应标签页的元素。

handles = driver.window_handles # 获取所有标签页的句柄

driver.switch_to.window(handles[1]) # 切换到指定句柄标签页

启动参数

Chrome Options是一个配置chrome启动时属性的类,通过这个参数我们可以为Chrome添加启动参数

设置 chrome 二进制文件位置 (binary_location)

添加启动参数 (add_argument)

添加扩展应用 (add_extension, add_encoded_extension)

添加实验性质的设置参数 (add_experimental_option)

设置调试器地址 (debugger_address)

Chrome Options常用的行为一般有以下几种:

禁止图片和视频的加载:提升网页加载速度。

添加代理:用于FQ访问某些页面,或者应对IP访问频率限制的反爬技术。

使用移动头:访问移动端的站点,一般这种站点的反爬技术比较薄弱。

添加扩展:像正常使用浏览器一样的功能。

设置编码:应对中文站,防止乱码。

阻止JavaScript执行

在UI自动化中打开浏览器前可以加入对浏览器的选项配置,通过设置不同的参数,可以修改浏览器的默认行为。

from selenium import webdriver

options = webdriver.ChromeOptions() # 实例化一个启动参数对象

options.add_argument('--headless') # 设置浏览器浏览器不提供可视化页面

options.add_argument('lang=zh_CN.UTF-8') # 设置编码

options.add_argument('--disable-infobars') # 禁止策略化

options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错

options.add_argument('window-size=1920x1080') # 指定浏览器分辨率

options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug

options.add_argument('--incognito') # 隐身模式(无痕模式)

options.add_argument('--disable-javascript') # 禁用javascript

options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错

options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示

options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面

options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度

options.add_argument('User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36

') # 设置UA请求头

driver = webdriver.Chrome(chrome_options=options)

执行JS脚本

有些情况下,selenium提供的API无法完成对应的操作或者操作比较麻烦,此时可以借助JS脚本来实现,例如执行滑动滚动条。

js ='window.scrollTo(0,100)' # 要执行的JS脚本语句

driver.execute_script(js) # 执行JS脚本

Frame切换

通常大多数网站页面都会使用到frame嵌套,这时即使frame嵌套页面的内容展示出来了,我们依然无法直接定位到frame里的元素,例如像优酷这种登录窗口

​此时若想操作frame里的元素,需要先切换到frame里再进行定位。

driver.switch_to.frame('alibaba-login-box') # 且换到指定frame

driver.switch_to.default_content() # 切回默认页面

隐藏指纹特征

使用slenium启动的浏览器,大多数都会被网站通过一些指纹特征监测到,识别到爬虫行为,就会拒绝selenium的操作,如何避免这种情况,关键点在于如何在浏览器检测之前将这些特征进行隐藏,事实上,前人已经为我们铺好了路,解决这个问题的关键,实际就是一个 stealth.min.js 文件,这个文件是给 puppeteer 用的,在 Python 中使用的话需要单独执行这个文件,该文件获取方式需要安装 node.js ,终端执行 npx extract-stealth-evasions下载该文件,并在操作浏览器前加上如下代码。

with open('stealth.min.js') as f:      js = f.read()  driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {'source': js})

结语

本文只是简单的介绍了selenium+python的安装使用,以及一些基础常用的API操作,还有很多高级操作、用法需要更深入的了解学习。实际运用的话可能还需要与其他框架、工具整合使用,这些都是需要经过更深层次的理解与学习。

Python接口自动化测试零基础入门到精通(2023最新版)

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

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

相关文章

深入理解强化学习——马尔可夫决策过程:动作价值函数

分类目录:《深入理解强化学习》总目录 不同于马尔可夫奖励过程,在马尔可夫决策过程中,由于动作的存在,我们额外定义一个动作价值函数(Action-value Function)。我们用 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)…

线程提交线程到线程池,有几种方式,哪一种方式是工作中不能使用的,无法捕捉异常,线程池的拒绝策略,线程池的提交方式

线程池的工作原理 JDK中提交线程到线程池,有几种方式,哪一种方式是工作中不能使用的,无法捕捉异常 两种提交任务的方法 ExecutorService 提供了两种提交任务的方法: execute():提交不需要返回值的任务 submit()&a…

【C语言】多组输入

C系列文章目录 目录 C系列文章目录 一、什么是多组输入? 二、如何使用多组输入 2.1,试题举例讲解 2.2,错误解法 2.3,我们实现多组输入的思路 2.4,第一种正确的解法 2.5,第二种正确的解法 2.6&…

Python入门教程 | Python3 字典(dict)

Python3 字典 字典是另一种可变容器模型,且可存储任意类型对象。 Python3中的字典是一种无序、可变、可迭代的数据结构,它由键(key)和对应的值(value)组成。字典在Python中被视为可变对象,这意…

ES ElasticSearch安装、可视化工具kibana安装

1、安装ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1访问测试: http://域名:9200/ 2、安装kibana对es进行可视化操作 执行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

如何实现在公网下使用navicat图形化工具远程连接本地内网的MariaDB数据库

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

Redis深入理解-Socket连接建立流程以及文件事件处理机制

Redis Server 运行原理图 Redis 服务器中 Socket 网络建立以及文件事件模型 一个 redis 单机,可以抗几百上千的并发,这里的并发指的就是同时可以有几百个 client 对这个 redis server 发起请求,都需要去建立网络连接,同时间可能会…

利用 docker 实现JMeter分布式压测

为什么需要分布式? 在工作中经常需要对一些关键接口做高QPS的压测,JMeter是由Java 语言开发,没创建一个线程(虚拟用户),JVM默认会为每个线程分配1M的堆栈内存空间。受限于单台试压机的配置很难实现太高的并…

YAML 深入解析:从语法到最佳实践

什么是YAML YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法,以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

【OpenCV实现图像:制作酷炫的动画效果】

文章目录 概要生成背景图添加点动画添加文本显示小结 概要 首先,通过导入必要的库,包括NumPy用于数学运算和Matplotlib库用于数据可视化。随后,创建图形和轴,初始化点的位置,以及编写初始化函数和更新函数。 初始化函…

C语言归并排序

以梦为马,不负韶华 文章目录 引入:实现原理问题引出:递归实现:迭代实现稳定性分析:总结: 引入: 如何将两个有序数组(假设为升序)合并为一个有序数组? 双指针…

yolov5/v7修改标签和检测框显示【最全】

《记录自己在使用yolov5遇到的一些问题》同时也供大家参考,如果对你们有帮助,希望大家可以给个点赞、收藏鼓励下,非常感谢! 以自带的一张图片作为示例,yolov5(6.1版本)的初始检测框应该是如下图所示 修改线条粗细、隐藏标签、隐…

EI论文故障识别程序:DBN深度置信/信念网络的故障识别Matlab程序,数据由Excel导入,直接运行!

​适用平台:Matlab2021b版及以上 本程序参考中文EI期刊《基于变分模态分解和改进灰狼算法优化深度置信网络的自动转换开关故障识别》中的深度置信网络(Deep Belief Network,DBN)部分进行故障识别,程序注释清晰&#x…

Python之学生信息管理系统

目录 一、基础界面实现 1、主函数 2、保持循环,获取用户需求 二、函数实现模块功能 1、添加学生信息 2、删除学生信息 3、修改学生信息 4、查找全部学生信息 5、退出系统 三、整合代码 1、 完整代码 2、完整实现过程 实现 打印功能菜单、添加学生信息、删…

想自学软件测试?一般人我还是劝你算了吧。。。

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

<keep-alive>作用及用法

<keep-alive>是Vue.js的内置组件。它用于缓存具有相同组件树的组件。当组件使用<keep-alive>包裹时&#xff0c;组件不会被销毁&#xff0c;而是会缓存到内存中&#xff0c;等到下次再次渲染时&#xff0c;直接使用缓存中的组件实例。 <keep-alive>有以下几…

【Linux】共享内存

文章目录 一、共享内存的原理详谈共享内存的实现过程二、共享内存的接口函数1.shmget2. shmatshmdtshmctl 进程间使用共享内存通信三、共享内存的特性 关于代码 一、共享内存的原理 共享内存是由操作系统维护和管理的一块内存。 共享内存的本质是内核级的缓冲区。 一个进程向…

C语言精华题目锦集1

第一题 test.c文件中包括如下语句&#xff0c;文件中定义的四个变量中&#xff0c;是指针类型的是&#xff08;&#xff09;【多选】 #define INT_PTR int* typedef int* intptr; INT_PRT a,b; int_ptr c,d;A:a  B:b  C:c  D:d #define是宏定义&#xff0c;此时在程序中IN…

SQLite3 数据库学习(六):Qt 嵌入式 Web 服务器详解

参考引用 SQLite 权威指南&#xff08;第二版&#xff09;SQLite3 入门 1. Apache 搭建 cgi 环境 1.1 什么是 Apache Apache 是世界使用排名第一的 Web 服务器软件 它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用 1.2 具体搭建流程…

一、用户管理

一、后端数据库初始化 1.1 因为版本问题&#xff0c;始终报错&#xff0c;按照报错信息去查询解决方案&#xff0c;无法解决 灵机一动&#xff1a; 网址&#xff1a; Spring Boot 3.0 升级 实战踩坑记录 - 掘金 (juejin.cn) &#xff11;.&#xff12; 个人配置【运行成功…