从零开始学 Selenium:浏览器驱动、元素定位与实战技巧_selenium浏览器驱动
目录
-
-
- 一、Selenium简介
-
- 1. 什么是Selenium?
- 2. Selenium的组成
- 3. 应用场景
- 二、环境搭建
-
- 1. 安装Python
- 2. 安装Selenium
- 3. 浏览器驱动配置
- 4. 验证环境
- 三、基础操作
-
- 1. 启动浏览器与访问网页
- 2. 元素定位(核心!)
- 3. 操作元素
- 四、等待机制
-
- 1. 隐式等待
- 2. 显式等待
- 3. 强制等待
- 五、浏览器操作
-
- 1. 窗口操作
- 2. 导航操作
- 3. 处理iframe
- 六、弹窗处理
- 七、文件操作
-
- 1. 文件上传
- 2. 文件下载
- 八、键盘与鼠标操作
-
- 1. 键盘操作
- 2. 鼠标操作
- 九、测试框架集成
-
- 1. 与unittest结合
- 2. 生成测试报告
- 十、高级技巧与最佳实践
- 十一、常见问题与解决方案
-
以下是一份详细的Selenium全教程,涵盖从基础到进阶的核心知识点,基于Selenium 4版本(当前主流版本),适合新手入门及进阶学习。
一、Selenium简介
1. 什么是Selenium?
Selenium是一个用于Web应用程序自动化测试的工具集,支持多浏览器(Chrome、Firefox、Edge等)、多语言(Python、Java、C#等),核心功能是模拟人类操作浏览器(点击、输入、跳转等)。
2. Selenium的组成
- Selenium WebDriver:核心组件,通过代码驱动浏览器,支持跨语言(本文以Python为例)。
- Selenium IDE:浏览器插件,用于录制/回放操作(适合快速生成简单脚本)。
- Selenium Grid:用于分布式测试,可在多台机器/浏览器上同时执行用例。
3. 应用场景
- 自动化测试(功能测试、回归测试)。
- 网页数据爬取(模拟登录、动态内容获取)。
- 自动化操作(如批量填写表单、定时任务)。
二、环境搭建
1. 安装Python
Selenium需依赖Python环境,下载地址:Python官网,安装时勾选“Add Python to PATH”。
2. 安装Selenium
打开命令行,执行:
pip install selenium # 安装最新版Selenium 4
3. 浏览器驱动配置
WebDriver需要通过“浏览器驱动”与浏览器通信,不同浏览器需对应驱动:
配置步骤:
- 下载与浏览器版本匹配的驱动(如Chrome 114需对应ChromeDriver 114.x)。
- 将驱动文件(如
chromedriver.exe
)放在任意目录,建议放在Python安装目录或添加到系统环境变量PATH
。
4. 验证环境
运行以下代码,若能打开Chrome并访问百度,则配置成功:
from selenium import webdriver# 启动Chrome浏览器driver = webdriver.Chrome()# 访问百度driver.get(\"https://www.baidu.com\")# 停留3秒后关闭import timetime.sleep(3)driver.quit()
三、基础操作
1. 启动浏览器与访问网页
from selenium import webdriver# 启动浏览器(Chrome/Firefox/Edge)driver = webdriver.Chrome() # Chrome# driver = webdriver.Firefox() # Firefox# driver = webdriver.Edge() # Edge# 访问网页driver.get(\"https://www.baidu.com\")# 获取当前页面标题和URLprint(\"标题:\", driver.title) # 输出:百度一下,你就知道print(\"URL:\", driver.current_url) # 输出:https://www.baidu.com/# 关闭浏览器(quit()关闭所有窗口,close()关闭当前窗口)driver.quit()
2. 元素定位(核心!)
Selenium提供8种元素定位方式,需结合网页HTML结构使用。推荐使用By
类(Selenium 4推荐写法)。
步骤:
- 打开网页,按F12打开开发者工具,通过“元素选择器”定位元素。
- 复制元素属性(如ID、XPath等)。
driver.find_element(By.ID, \"kw\")
driver.find_element(By.NAME, \"wd\")
driver.find_element(By.CLASS_NAME, \"s_ipt\")
)driver.find_element(By.TAG_NAME, \"input\")
driver.find_element(By.LINK_TEXT, \"新闻\")
driver.find_element(By.PARTIAL_LINK_TEXT, \"新\")
driver.find_element(By.XPATH, \'//input[@id=\"kw\"]\')
driver.find_element(By.CSS_SELECTOR, \"#kw\")
示例:定位百度搜索框并输入内容
from selenium import webdriverfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get(\"https://www.baidu.com\")# 定位搜索框(id为\"kw\")search_box = driver.find_element(By.ID, \"kw\")# 输入文本search_box.send_keys(\"Selenium教程\")# 定位搜索按钮(id为\"su\")并点击search_btn = driver.find_element(By.ID, \"su\")search_btn.click()time.sleep(3)driver.quit()
XPath进阶:
XPath是最灵活的定位方式,支持复杂场景:
- 绝对路径:
/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input
(不推荐,易变)。 - 相对路径:
//input[@name=\"wd\" and @class=\"s_ipt\"]
(通过多属性定位)。 - 文本定位:
//a[text()=\"新闻\"]
(精确匹配文本)。 - 包含文本:
//a[contains(text(), \"新\")]
(模糊匹配)。
3. 操作元素
send_keys(\"文本\")
click()
clear()
get_attribute(\"属性名\")
text
is_displayed()
示例:
# 获取搜索框的value属性(输入的内容)print(search_box.get_attribute(\"value\")) # 输出:Selenium教程# 获取百度logo的文本(实际为空,logo通常无文本)logo = driver.find_element(By.CLASS_NAME, \"index-logo-src\")print(logo.text) # 输出:空字符串# 判断搜索按钮是否可见print(search_btn.is_displayed()) # 输出:True
四、等待机制
网页加载存在延迟(如JS渲染、网络延迟),直接操作元素可能导致“元素未找到”错误,需设置等待。
1. 隐式等待
全局等待,设置一次后对所有元素生效,等待元素加载完成(最多等待指定时间)。
driver.implicitly_wait(10) # 等待10秒(单位:秒)
2. 显式等待
针对特定元素的等待,更灵活,需结合WebDriverWait
和expected_conditions
(预期条件)。
from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 等待搜索结果加载(最多10秒,每0.5秒检查一次)# 条件:id为\"content_left\"的元素可见result = WebDriverWait(driver, 10, 0.5).until( EC.visibility_of_element_located((By.ID, \"content_left\")))print(\"搜索结果已加载\")
常用预期条件:
visibility_of_element_located
:元素可见。element_to_be_clickable
:元素可点击。text_to_be_present_in_element
:元素包含指定文本。
3. 强制等待
直接暂停程序,不推荐(硬编码等待时间,效率低):
import timetime.sleep(3) # 强制等待3秒
五、浏览器操作
1. 窗口操作
# 设置窗口大小(最大化/指定尺寸)driver.maximize_window() # 最大化driver.set_window_size(1200, 800) # 宽1200,高800# 获取窗口句柄(唯一标识)current_window = driver.current_window_handle # 当前窗口all_windows = driver.window_handles # 所有窗口# 切换窗口(如点击链接打开新窗口后切换)driver.find_element(By.LINK_TEXT, \"新闻\").click() # 打开新窗口for window in all_windows: if window != current_window: driver.switch_to.window(window) # 切换到新窗口
2. 导航操作
driver.get(\"https://www.baidu.com\")driver.get(\"https://www.bing.com\") # 访问必应driver.back() # 后退到百度driver.forward() # 前进到必应driver.refresh() # 刷新页面
3. 处理iframe
iframe是嵌套在网页中的子页面(如登录框、广告),需先切换到iframe才能操作内部元素。
# 切换到iframe(通过id、name、索引或WebElement)driver.switch_to.frame(\"iframe_id\") # 通过id# driver.switch_to.frame(0) # 通过索引(第1个iframe)# 操作iframe内的元素(如输入用户名)driver.find_element(By.ID, \"username\").send_keys(\"test\")# 切回主文档(必须!否则无法操作主页面元素)driver.switch_to.default_content()
六、弹窗处理
网页弹窗(Alert、Confirm、Prompt)需通过switch_to.alert
处理:
alert.accept()
(确认)alert.accept()
(确认)/ alert.dismiss()
(取消)alert.send_keys(\"文本\")
+ alert.accept()
示例:
# 触发弹窗(假设点击按钮后弹出Confirm)driver.find_element(By.ID, \"show_confirm\").click()# 切换到弹窗alert = driver.switch_to.alertprint(\"弹窗文本:\", alert.text) # 获取弹窗文本# 取消弹窗alert.dismiss()
七、文件操作
1. 文件上传
通过定位元素,使用
send_keys
传入文件路径(无需点击上传按钮):
# 定位上传按钮(必须是input标签)upload_btn = driver.find_element(By.ID, \"upload\")# 传入文件绝对路径upload_btn.send_keys(\"C:/test.txt\")
2. 文件下载
需配置浏览器默认下载路径(以Chrome为例):
from selenium.webdriver.chrome.options import Options# 配置Chrome下载路径chrome_options = Options()prefs = { \"download.default_directory\": \"C:/downloads\", # 下载路径 \"download.prompt_for_download\": False # 不弹出下载提示}chrome_options.add_experimental_option(\"prefs\", prefs)# 启动配置后的Chromedriver = webdriver.Chrome(options=chrome_options)# 点击下载链接driver.find_element(By.LINK_TEXT, \"下载文件\").click()
八、键盘与鼠标操作
需使用ActionChains
类模拟键盘和鼠标动作。
1. 键盘操作
from selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.common.keys import Keys# 定位搜索框search_box = driver.find_element(By.ID, \"kw\")search_box.send_keys(\"Selenium\")# 全选(Ctrl+A)→ 复制(Ctrl+C)→ 清空 → 粘贴(Ctrl+V)ActionChains(driver).key_down(Keys.CONTROL).send_keys(\"a\").key_up(Keys.CONTROL).perform()ActionChains(driver).key_down(Keys.CONTROL).send_keys(\"c\").key_up(Keys.CONTROL).perform()search_box.clear()ActionChains(driver).key_down(Keys.CONTROL).send_keys(\"v\").key_up(Keys.CONTROL).perform()
2. 鼠标操作
# 定位元素element = driver.find_element(By.ID, \"xxx\")# 右键点击ActionChains(driver).context_click(element).perform()# 双击ActionChains(driver).double_click(element).perform()# 拖拽(从元素A拖到元素B)source = driver.find_element(By.ID, \"source\")target = driver.find_element(By.ID, \"target\")ActionChains(driver).drag_and_drop(source, target).perform()
九、测试框架集成
Selenium常与Python测试框架(如unittest
、pytest
)结合,实现用例管理和报告生成。
1. 与unittest结合
import unittestfrom selenium import webdriverfrom selenium.webdriver.common.by import Byclass TestBaidu(unittest.TestCase): def setUp(self): # 前置操作:启动浏览器 self.driver = webdriver.Chrome() self.driver.get(\"https://www.baidu.com\") def test_search(self): # 测试用例:搜索 self.driver.find_element(By.ID, \"kw\").send_keys(\"unittest\") self.driver.find_element(By.ID, \"su\").click() # 断言:页面标题包含\"unittest\" self.assertIn(\"unittest\", self.driver.title) def tearDown(self): # 后置操作:关闭浏览器 self.driver.quit()if __name__ == \"__main__\": unittest.main()
2. 生成测试报告
使用HTMLTestRunner
生成HTML报告:
pip install html-testRunner
import HtmlTestRunner# 运行用例并生成报告if __name__ == \"__main__\": unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner( output=\"report\", # 报告目录 report_name=\"百度搜索测试报告\" ))
十、高级技巧与最佳实践
-
封装公共方法:将常用操作(如打开网页、定位元素)封装为工具类,减少重复代码。
class BrowserUtils: def __init__(self, driver): self.driver = driver def open_url(self, url): self.driver.get(url) def find_element(self, by, value): return self.driver.find_element(by, value)
-
处理动态元素:动态ID(如包含时间戳)可通过XPath模糊匹配:
//div[contains(@id, \"dynamic_\")]
。 -
避免硬编码:将URL、账号密码等配置存入
config.ini
,通过configparser
读取。 -
Selenium Grid:分布式执行用例,需启动Hub和Node:
# 启动Hub(端口4444)java -jar selenium-server-4.xx.xx.jar hub# 启动Node(连接Hub)java -jar selenium-server-4.xx.xx.jar node --hub http://localhost:4444/grid/register
十一、常见问题与解决方案
quit()
;更新驱动版本通过以上内容,可系统掌握Selenium的核心用法。实际使用中需结合具体场景灵活调整,多练习元素定位和等待机制是关键!