来源是b站2025最新Selenium教程(Python 网页自动化测试脚本)
前言
三方库:Selenium
什么是自动化:
自动化是指使用技术手段模拟人工,执行重复性任务。准确性100%
自动化应用场景:
- 自动化测试
- 自动化运维
- 自动化办公
- 自动化游戏
Selenium
- web自动化中的老牌指名开源库
- 支持多种浏览器:谷歌Chrome、火狐Firefox、微软Edge、苹果Safari等
- 跨平台、兼容性高
- 通过浏览器驱动控制浏览器,通过元素定位模拟人工交互以实现web自动化(无焦点状态依然执行)
官方技术文档
https://www.selenium.dev/
本笔记内容:
- Selenium库的所有常用语句和功能
- 浏览器配置、元素定位、元素交互
- 多种web场景下的案例、多线程执行(多开)等等
Selenium环境安装
- 谷歌Chrome浏览器右上角…-帮助-关于,确认浏览器版本
- 安装浏览器驱动,驱动的版本号要和浏览器的版本号对应符合(至少大版本号要一致)。
官方最新驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/ - 把驱动的exe文件放在项目的根目录下
- 安装三方库,在终端中执行在后面加’==3.141.0’(版本号)就是指定版本下载
1
pip install selenium
设置浏览器
导包
1 | from selenium import webdriver # 用于操作浏览器 |
设置
创建设置浏览器对象
1 | q1 = Options() |
禁用沙盒模式,如果浏览器闪退就使用这句
1 | driver.add_argument('--no-sandbox') |
保持浏览器打开状态(默认是代码执行完毕自动关闭)
1 | q1.add_experimental_option('detach',True) |
创建并启动浏览器,所以浏览器的驱动器要放在根目录下,不写绝对路径就自动在根目录下查找
1 | a1 = webdriver.Chrome(service=Service('chromedriver.exe'), options=q1) |
- 上面的导包和设置写好放在那里不用动就行
基本操作
打开网址
1 | a1.get("https://baidu.com") |
等待时间
1 | time.sleep(2) |
关闭当前标签页
1 | a1.close() |
退出浏览器
1 | a1.quit() |
浏览器打开位置
1 | a1.set_window_position(0,0) |
浏览器打开尺寸
1 | a1.set_window_size(600,600) |
浏览器最大化
1 | a1.maximize_window() |
浏览器最小化
1 | a1.minimize_window() |
浏览器截图
1 | a1.get_screenshot_as_file('1.png') |
刷新当前网页
1 | a1.refresh() |
元素定位
定位一个元素 find_element
1 | a2 = a1.find_element(By.ID,'kw') |
定位多个元素 find_elements
1 | a2 = a1.find_elements(By.ID,'kw') |
在浏览器查找多个元素,在控制台输入
1 | document.getElementById('元素值') |
元素定位导包
1 | from selenium.webdriver.common.by import By |
元素交互操作
- 元素点击
click()
- 元素输入
send_keys('')
- 元素清空
clear()
元素定位-ID
- 通过ID定位元素,一般比较准确。
- 并不是所有网页或者元素都有ID值
1
a1.find_element(By.ID,'kw').send_keys('输入的文字')
元素定位-NAME
- 通过NAME定位元素,一般比较准确。
- 并不是所有网页或者元素都有NAME值
1
a1.find_element(By.NAME,'wd').send_keys('输入的文字')
元素定位-CLASS_NAME
- class值不能有空格,否则报错
- class值重复的有很多,需要切片
- class值有的网站是随机的,每次刷新都会改变
1
2// 单个搜索
a1.find_element(By.CLASS_NAME, 's_ipt').send_keys('输入的文字')1
2// 切片
a1.find_elements(By.CLASS_NAME, 'channel-icons__item')[1].click()
元素定位-TAG_NAME
- 查找<开头标签名字>
- 重复的标签名字特别多,需要切片
1
2// 切片
a1.find_elements(By.TAG_NAME, 'a')[3].click()
元素定位-LINK_TEXT
- 通过精准链接文本找到标签a的元素
- 有重复的文本需要切片
1
a1.find_element(By.LINK_TEXT, '音乐')[3].click()
元素定位-PARTIAL_LINK_TEXT
- 通过模糊链接文本找到标签a的元素
[模糊文本定位]
- 有重复的文本,需要切片
1
a1.find_element(By.PARTIAL_LINK_TEXT, '图')[3].click()
元素定位-CSS_SELECTOR
#id = 井号+id值 通过id定位
.class = 点+class值 通过class定位
不加修饰符 = 标签头 通过标签头定位
通过任意类型定位:
"[类型 = '精准值']"
通过任意类型定位:
"[类型* = '模糊值']"
通过任意类型定位:
"[类型^ = '开头值']"
通过任意类型定位:
"[类型$'结尾值']"
以上这些方法都属于理论定位法1
a1.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(6)").click()
更简单的定位方式:在谷歌控制台直接复制
SELECTOR
(个别元素的定位值会比较长)1
a1.find_element(By.CSS_SELECTOR, "#kw").send_keys('输入的文本')
元素定位-XPATH
- 复制谷歌浏览器 Xpath (通过属性+路径定位,属性如果是随机的,可能定位不到)
- 复制谷歌浏览器 Xpath 完整路径 (缺点是定位值比较长,优点是基本100%精确)
1
a1.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[3]/a[1]').click()
元素定位隐形等待
多少秒内找到元素就立刻执行,没找到元素就报错
设置语句,设置一次就行
1 | a1.implicitly_wait(30) |
单选、多选、下拉元素交互
单选:定位元素复制Xpath即可
多选:定位元素依次复制Xpath即可
下拉:定位元素复制Xpath即可(有些时候可以直接定位,有些时候需要点击开下拉列表后再定位)
日期、评星、上传元素交互
日期:定位元素复制Xpath,使用send_keys直接写入
评星:定位元素复制Xpath即可
上传:定位元素复制Xpath,使用send_keys写入上传文件的全部绝对路径