百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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 对象的常用属性和方法

  1. driver.page_source 当前标签页浏览器渲染之后的网页源代码
  1. driver.current_url 当前标签页的url
  1. driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
  1. driver.quit() 关闭浏览器
  1. driver.forward() 页面前进
  1. driver.back() 页面后退
  1. driver.screen_shot(img_name) 页面截图

driver对象定位标签元素获取标签对象的方法

  1. find_element(By.TAG_NAME, "tag_name") 通过元素的标签名定位(如 <div>、<input> 等)
  1. find_element(By.CSS_SELECTOR, "css_selector") 通过 CSS 选择器定位元素
  1. find_element(By.NAME, "name_value") 通过元素的 name 属性定位
  1. find_element(By.CLASS_NAME, "class_name") 通过元素的 class 属性定位
  1. find_element(By.TAG_NAME, "tag_name") 通过元素的标签名定位(如 <div>、<input> 等)
  1. find_element(By.XPATH, "xpath_expression") 通过 XPath 表达式定位元素
  1. find_element(By.LINK_TEXT, "link_text") 通过链接的文本内容定位(适用于 <a> 标签)
  1. 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 提供了多种等待机制来解决这一问题。

  1. 隐式等待
  1. 显示等待
  1. 固定等待
  1. 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()

相关推荐

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,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...