一、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环境,安装时勾选“add python to path”。
2. 安装selenium
打开命令行,执行:
pip install selenium # 安装最新版selenium 4
3. 浏览器驱动配置
webdriver需要通过“浏览器驱动”与浏览器通信,不同浏览器需对应驱动:
| 浏览器 | 驱动名称 |
|---|---|
| chrome | chromedriver |
| firefox | geckodriver |
| edge | edgedriver |
配置步骤:
- 下载与浏览器版本匹配的驱动(如chrome 114需对应chromedriver 114.x)。
- 将驱动文件(如
chromedriver.exe)放在任意目录,建议放在python安装目录或添加到系统环境变量path。
4. 验证环境
运行以下代码,若能打开chrome并访问百度,则配置成功:
三、基础操作
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")
# 获取当前页面标题和url
print("标题:", 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等)。
| 定位方式 | 说明 | 示例代码 |
|---|---|---|
| id | 通过元素id属性定位(唯一) | driver.find_element(by.id, "kw") |
| name | 通过元素name属性定位 | driver.find_element(by.name, "wd") |
| class name | 通过元素class属性定位 | driver.find_element(by.class_name, "s_ipt") |
| tag name | 通过标签名定位(如<input>) | driver.find_element(by.tag_name, "input") |
| link text | 通过链接文本定位(精确匹配) | driver.find_element(by.link_text, "新闻") |
| partial link text | 通过链接文本模糊匹配 | driver.find_element(by.partial_link_text, "新") |
| xpath | 基于xml路径定位(万能) | driver.find_element(by.xpath, '//input[@id="kw"]') |
| css selector | 基于css选择器定位 | driver.find_element(by.css_selector, "#kw") |
示例:定位百度搜索框并输入内容
from selenium import webdriver
from selenium.webdriver.common.by import by
driver = 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("属性名") | 获取元素属性(如value、href) |
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 webdriverwait
from 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 time time.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 | 只有“确定”按钮 | alert.accept()(确认) |
| confirm | 有“确定”和“取消”按钮 | alert.accept()(确认)/ alert.dismiss()(取消) |
| prompt | 可输入文本的弹窗 | alert.send_keys("文本") + alert.accept() |
示例:
# 触发弹窗(假设点击按钮后弹出confirm)
driver.find_element(by.id, "show_confirm").click()
# 切换到弹窗
alert = driver.switch_to.alert
print("弹窗文本:", alert.text) # 获取弹窗文本
# 取消弹窗
alert.dismiss()
七、文件操作
1. 文件上传
通过定位<input type="file">元素,使用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)
# 启动配置后的chrome
driver = webdriver.chrome(options=chrome_options)
# 点击下载链接
driver.find_element(by.link_text, "下载文件").click()
八、键盘与鼠标操作
需使用actionchains类模拟键盘和鼠标动作。
1. 键盘操作
from selenium.webdriver.common.action_chains import actionchains
from 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 unittest
from selenium import webdriver
from selenium.webdriver.common.by import by
class 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
十一、常见问题与解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 元素定位不到 | 元素在iframe内;未加载完成;动态id | 切换iframe;增加等待;使用模糊定位 |
| 浏览器自动关闭 | 代码执行完毕;驱动与浏览器版本不匹配 | 检查代码是否有quit();更新驱动版本 |
| 弹窗切换失败 | 弹窗未加载;非alert类型弹窗 | 增加等待;通过元素定位处理非alert弹窗 |
通过以上内容,可系统掌握selenium的核心用法。实际使用中需结合具体场景灵活调整,多练习元素定位和等待机制是关键!
到此这篇关于从零开始学习python selenium浏览器元素定位与实战技巧的文章就介绍到这了,更多相关python selenium教程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论