selenium(WEB自动化工具)
itomcoil 2025-08-06 20:29 2 浏览
定义解释
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好地工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
selenium 运行效果
chrome 浏览器的运行效果
安装好 selenium 模块后,运行下面代码
from selenium import webdriver
driver = webdriver.Chrome()
#向一个url发起请求
driver.get("http://www.python.org")
#打印页面标题
print(driver.title)
#退出模拟器 不退出会残留进程
driver.quit()
selenium的作用和工作原理
利用浏览器原生的 API,封装成一套更加面向对象的 Selenium web Driver API,直接操作浏览器页面里的元素,甚至操作浏览器本生(截屏、窗口大小、关闭、安装插件、配置证书等)
selenium 的简单使用
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
#控制浏览器访问url地址
driver.get("http://www.baidu.com")
#在百度中搜索python
driver.find_element(By.ID, "kw").send_keys("python")
#点击百度搜索
driver.find_element(By.ID, "su").click()
print(driver.current_url)
#退出浏览器
driver.quit()
运行打印出当前 url:
webdriver.Chrome(executable_path='./chromedriver')中executable参数指定的是下载好的chromedriver文件的路径
driver.find_element(By.ID, "kw").send_keys("python")定位id属性值是'kw'的标签,并向其中输入字符串'python'
driver.find_element(By.ID, "su").click()定位id属性值是su的标签,并点击
click函数作用是:触发标签的js的click事件
selenium 提取数据
driver 对象的常用属性和方法
- driver.page_source 当前标签页浏览器渲染之后的网页源代码
- driver.current_url 当前标签页的url
- driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
- driver.quit() 关闭浏览器
- driver.forward() 页面前进
- driver.back() 页面后退
- driver.screen_shot(img_name) 页面截图
driver对象定位标签元素获取标签对象的方法
- find_element(By.TAG_NAME, "tag_name") 通过元素的标签名定位(如 <div>、<input> 等)
- find_element(By.CSS_SELECTOR, "css_selector") 通过 CSS 选择器定位元素
- find_element(By.NAME, "name_value") 通过元素的 name 属性定位
- find_element(By.CLASS_NAME, "class_name") 通过元素的 class 属性定位
- find_element(By.TAG_NAME, "tag_name") 通过元素的标签名定位(如 <div>、<input> 等)
- find_element(By.XPATH, "xpath_expression") 通过 XPath 表达式定位元素
- find_element(By.LINK_TEXT, "link_text") 通过链接的文本内容定位(适用于 <a> 标签)
- find_element(By.PARTIAL_LINK_TEXT, "partial_link_text") 通过链接的部分文本内容定位
注意:
- find_element和find_elements的区别:
- 多了个s就返回列表,没有s就返回匹配到的第一个标签对象
- find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表
- by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本
- 以上函数的使用方法
- driver.find_element_by_id('id_str')
标签对象提取文本内容和属性值
输入文本 | send_keys("text") | 向输入框或文本区域输入指定的文本。 | element.send_keys("testuser") |
点击元素 | click() | 点击按钮、链接或其他可点击的元素。 | element.click() |
清除输入框内容 | clear() | 清除输入框或文本区域中的内容。 | element.clear() |
获取元素属性 | get_attribute("attribute_name") | 获取元素的指定属性值(如 value 、href 、class 等)。 | value = element.get_attribute("value") |
获取元素文本 | text | 获取元素的可见文本内容。 | print(element.text) |
复选框/单选框操作 | is_selected() 和 click() | 检查复选框或单选框是否被选中,并选中或取消选中。 | if not checkbox.is_selected(): checkbox.click() |
下拉列表操作 | Select 类的 select_by_index 、select_by_value 、select_by_visible_text | 通过索引、值或可见文本选择下拉列表的选项。 | dropdown.select_by_visible_text("China") |
鼠标操作 | ActionChains 类的 click 、double_click 、context_click 、drag_and_drop 、move_to_element | 执行复杂的鼠标操作,如点击、双击、拖放、悬停等。 | actions.move_to_element(element).perform() |
键盘操作 | Keys 类的 send_keys(Keys.KEY_NAME) | 模拟键盘操作,如按下回车键、Tab 键、组合键等。 | element.send_keys(Keys.ENTER) |
文件上传 | send_keys("file_path") | 通过 <input type="file"> 元素上传文件。 | element.send_keys("/path/to/file.txt") |
执行 JavaScript | execute_script("javascript_code") | 执行 JavaScript 代码,用于复杂的操作或修改页面内容。 | driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") |
selenium 鼠标和键盘操作
操作 | 方法 | 说明 |
点击 | click(element) 或 click() | 点击指定的元素或当前鼠标位置。 |
双击 | double_click(element) 或 double_click() | 双击指定的元素或当前鼠标位置。 |
右键点击 | context_click(element) 或 context_click() | 右键点击指定的元素或当前鼠标位置。 |
拖放 | drag_and_drop(source, target) | 将源元素拖放到目标元素。 |
悬停 | move_to_element(element) | 将鼠标移动到指定元素上。 |
按住和释放 | click_and_hold(element) 和 release() | 按住指定元素并释放,用于实现拖拽操作。 |
键盘操作
操作 | 方法 | 说明 |
输入文本 | send_keys("text") | 向输入框或文本区域输入指定的文本。 |
按下组合键 | send_keys(Keys.CONTROL + 'a') | 模拟按下组合键(如 Ctrl + A)。 |
按下单个键 | send_keys(Keys.KEY_NAME) | 模拟按下单个键(如 Enter、Tab、Shift 等)。 |
释放按键 | key_up(key) | 释放按下的键。 |
常用键盘键值
键值 | 说明 |
Keys.ENTER | 回车键 |
Keys.TAB | Tab 键 |
Keys.SHIFT | Shift 键 |
Keys.CONTROL | Ctrl 键 |
Keys.ALT | Alt 键 |
Keys.ESCAPE | Esc 键 |
Keys.BACKSPACE | 退格键 |
Keys.SPACE | 空格键 |
Keys.ARROW_UP | 上箭头键 |
Keys.ARROW_DOWN | 下箭头键 |
Keys.ARROW_LEFT | 左箭头键 |
Keys.ARROW_RIGHT | 右箭头键 |
selenium 的其他使用方法
selenium 标签页的切换
当 selenium 控制浏览器打开多个标签页时,如何控制浏览器在多个标签页之间进行切换?分两步处理
- 获取所有标签页的窗口权柄
- 利用窗口权柄字切换到权柄指向标签页对象的标识
- 这里的窗口权柄是指:标签页对象的标识
#1、获取当前所有的标签页的权柄构成的列表
current_windows = driver.window_handles
#2、根据标签页权柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])
测试示例
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(1)
driver.find_element(By.ID, "kw").send_keys("python")
time.sleep(1)
driver.find_element(By.ID, "su").click()
time.sleep(1)
#通过执行js来新开一个标签页
js = 'window.open("http://www.sougou.com");'
driver.execute_script(js)
time.sleep(1)
#获取当前全部窗口
current_windows = driver.window_handles
time.sleep(2)
#根据窗口索引进行切换
driver.switch_to.window(current_windows[0])
time.sleep(2)
driver.switch_to.window(current_windows[1])
time.sleep(6)
driver.quit()
switch_to 切换 frame 标签
iframe 是嵌入在网页中的另一个网页。Selenium 提供了 switch_to.frame() 方法来切换到 iframe。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
url = 'https://wx.mail.qq.com/?cancel_login=true&from=get_ticket_fail'
driver.get(url)
login_frame = driver.find_element(By.ID,'iframe_wx')
driver.switch_to.frame(login_frame)
print(driver.title)
"""操作frame外边的元素需要切换出去"""
windows = driver.window_handles
driver.switch_to.window(windows[0])
content = driver.find_element(By.CLASS_NAME,'login_pictures_title').text
print(content)
driver.quit()
- 总结:
- 切换到定位的frame标签嵌套的页面中
- driver.switch_to.frame(通过find_element_by函数定位的frame、iframe标签对象)
- 利用切换标签页的方式切出frame标签
windows = driver.window_handles
driver.switch_to.window(windows[0])
selnium 对 cookie 的处理
Selenium 提供了 get_cookies()、add_cookie()、delete_cookie() 等方法来操作浏览器的 Cookies。
获取 cookie
driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,还有domain等cookie其他维度的信息。所以如果想要把获取的cookie信息和requests模块配合使用的话,需要转换为name、value作为键值对的cookie字典
#获取当前标签页的全部cookie信息
print(driver.get_cookies())
#把cookie转化为字典
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
添加 cookie
# 添加 Cookie
driver.add_cookie({"name": "test", "value": "123"})
# 获取所有 Cookies
cookies = driver.get_cookies()
删除 cookie
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
执行 js 代码
Selenium 提供了 execute_script() 方法来执行 JavaScript 代码。
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.python.org")
time.sleep(1)
js = 'window.scrollTo(0, document.body.scrollHeight);'
driver.execute_script(js)
time.sleep(5)
driver.quit()
页面等待
在 Selenium 中,等待机制是确保页面元素加载完成后再进行操作的关键。
由于网页加载速度受网络、服务器性能等因素影响,直接操作未加载完成的元素会导致脚本失败。
Selenium 提供了多种等待机制来解决这一问题。
- 隐式等待
- 显示等待
- 固定等待
- fluent wait
隐式等待
隐式等待是一种全局性的等待机制,它会在查找元素时等待一定的时间。如果在指定的时间内找到了元素,Selenium 会立即继续执行后续操作;如果超时仍未找到元素,则会抛出 NoSuchElementException 异常。
import time
from selenium import webdriver
driver = webdriver.Chrome()
#设置隐式等待时间为10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
- 优点:
- 简单易用,只需设置一次即可应用于所有元素的查找操作
- 适用于大多数简单的场景
- 缺点:
- 全局性等待,可能会导致不必要的等待时间
- 无法处理某些负责的等待条件,例如等待元素变为可点击状态。
显示等待
显式等待是一种更为灵活的等待机制,它允许你为特定的操作设置等待条件。显式等待通常与 WebDriverWait 类和 expected_conditions 模块一起使用。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#设置显示等待,最多等待10秒,直到元素出现
element = WebDriverWait(driver, 10).until(
expected_conditions.presence_of_element_located(By.TAG_NAME,'a'))
driver.quit()
常用的 expected_conditions
- expected_conditions 模块提供了多种预定义的等待条件,以下是一些常用的条件:
- presence_of_element_located:等待元素出现在 DOM 中。
- visibility_of_element_located:等待元素出现在 DOM 中并且可见。
- element_to_be_clickable:等待元素可点击。
- text_to_be_present_in_element:等待元素的文本包含指定的文本。
优点:
- 灵活性高,可以为不同的操作设置不同的等待条件。
- 可以处理复杂的等待场景。
缺点:
- 代码相对复杂,需要更多的代码量。
- 需要为每个操作单独设置等待条件。
固定等待
固定等待是一种最简单的等待机制,它通过 time.sleep() 方法让脚本暂停执行指定的时间。无论页面是否加载完成,脚本都会等待指定的时间后再继续执行。
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#固定等待5秒
time.sleep(5)
print(driver.title)
driver.quit()
优点:
- 简单易用,适用于简单的测试场景。
缺点:
- 效率低下,可能会导致不必要的等待时间。
- 无法根据页面加载情况动态调整等待时间。
Fluent Wait
作用:动态设置等待条件,可以自定义轮询频率和忽略特定异常。
方法:WebDriverWait 结合 polling_every 和 ignoring
特点:更灵活,适用于需要动态调整等待时间的场景。
import time
from selenium import webdriver
from selenium.common import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#设置fluent wait
wait = WebDriverWait(driver, timeout=10,poll_frequency=1,ignored_exceptions=[TimeoutException]).until(
expected_conditions.presence_of_element_located(By.ID, "username")
)
driver.quit()
总结
- 隐式等待:适用于简单的场景,全局性等待,但可能会导致不必要的等待时间。
- 显式等待:适用于复杂的场景,灵活性高,但代码相对复杂。
- 固定等待:简单易用,但效率低下,不推荐在复杂的测试场景中使用。
- Fluent Wait::适用于需要动态调整等待时间的场景。
selenium 开启无界面模式
绝大多数服务器是没有界面的,selenium控制谷歌浏览器也是存在无界面模式的。
- 开启无界面模式的方法
- 实例化配置对象
- options = webdriver.ChromeOptions()
- 配置对象添加开启无界面模式的命令
- options.add_argument("--headless")
- 配置对象添加禁用gpu的命令
- options.add_argument("--disable-gpu")
- 实例化带有配置对象的driver对象
- driver = webdriver.Chrome(chrome_options=options)
import time
from selenium import webdriver
options = webdriver.ChromeOptions() #创建一个配置对象
options.add_argument('--headless') #开启无界面模式
options.add_argument('--disable-gpu') # 禁用gpu
# options.set_headles() # 无界面模式的另外一种开启方式
driver = webdriver.Chrome(options) #实例化带有配置的driver对象
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
selenium 使用代理 IP
selenium控制浏览器也是可以使用代理ip的!
- 使用代理ip的方法
- 实例化配置对象
- options = webdriver.ChromeOptions()
- 配置对象添加使用代理ip的命令
- options.add_argument('--proxy-server=http://202.20.16.82:9527')
- 实例化带有配置对象的driver对象
- driver = webdriver.Chrome('./chromedriver', chrome_options=options)
import time
from selenium import webdriver
options = webdriver.ChromeOptions() #创建一个配置对象
options.add_argument('--proxy-server=http://172.16.31.10:3128') #使用待遇ip
driver = webdriver.Chrome(options) #实例化带有配置的driver对象
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
selenium 替换 user-agent
selenium控制谷歌浏览器时,User-Agent默认是谷歌浏览器的,但是这个值是可以修改的。
- 替换user-agent的方法
- 实例化配置对象
- options = webdriver.ChromeOptions()
- 配置对象添加替换UA的命令
- options.add_argument('--user-agent=Mozilla/5.0 HAHA')
- 实例化带有配置对象的driver对象
- driver = webdriver.Chrome('./chromedriver', chrome_options=options)
import time
from selenium import webdriver
options = webdriver.ChromeOptions() #创建一个配置对象
options.add_argument('--user-agent=Mozilla/5.0') #替换User-agent
driver = webdriver.Chrome(options) #实例化带有配置的driver对象
driver.get("http://www.itcast.cn")
print(driver.title)
driver.quit()
- 上一篇:开发利器丨如何使用ELK设计微服务中的日志收集方案?
- 已经是最后一篇了
相关推荐
- selenium(WEB自动化工具)
-
定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...
- 开发利器丨如何使用ELK设计微服务中的日志收集方案?
-
【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...
- 高并发系统设计:应对每秒数万QPS的架构策略
-
当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...
- 2025 年每个 JavaScript 开发者都应该了解的功能
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...
- JavaScript Array 对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战
-
刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...
- 动力节点最新JavaScript教程(高级篇),深入学习JavaScript
-
JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...
- 一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code
-
当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...
- 「晚安·好梦」努力只能及格,拼命才能优秀
-
欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...
- JavaScript 中 some 与 every 方法的区别是什么?
-
大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...
- 10个高效的Python爬虫框架,你用过几个?
-
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...
- 12个高效的Python爬虫框架,你用过几个?
-
实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...
- pip3 install pyspider报错问题解决
-
运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...
- PySpider框架的使用
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 「机器学习」神经网络的激活函数、并通过python实现激活函数
-
神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)