介绍
Selenium 是一个用于自动化 Web 浏览器的开源工具套件,主要用于 Web 应用程序测试,也可用于网页抓取和自动化 Web 任务。
Selenium IDE
Webdriver
webdriver的工作原理
- 启动浏览器后,webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的remote server。
- 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。
- Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。
Selenium Grid
搭建自动化环境
安装驱动管理
WebDriver-Manager 是一个用于自动化管理 Web 驱动程序的工具库,它可以自动下载、配置和维护 Selenium WebDriver 所需的各种浏览器驱动(如 ChromeDriver、GeckoDriver、EdgeDriver 等),极大简化了自动化测试和 Web 应用程序开发中的驱动管理问题。
pip install webdriver-manager
安装selenium库
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")
操作测试对象
点击/提交对象
#找到百度⼀下按钮并点击
driver.find_element(By.CSS_SELECTOR, "#su").click()
模拟按键输⼊
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴")
清除文本内容
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=driver.find_element(By.CSS_SELECTOR,"#su").get_attribute("value")
print(text)
获取当前页面标题
title = driver.title
获取当前页面URL
url = driver.current_url
窗⼝
切换窗口
1)获取当前⻚⾯句柄: driver.current_window_handle
2)获取所有⻚⾯句柄: driver.window_handles
curWindow = driver.current_window_handle
allWindows = driver.window_handles
for window in allWindows:if window != curWindow:driver.switch_to.window(window)
窗口设置大小
#窗⼝最⼤化
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)
关闭窗⼝
弹窗

alert = driver.switchTo.alert
//确认
alert.accept()
//取消
alert.dismiss()
等待
强制等待
隐式等待
#隐式等待5秒
driver.implicitly_wait(5)
显式等待
WebDriverWait(driver,sec).until(functions)
浏览器参数设置
设置无头模式
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)