一.快速入门
Selenium是一个开源的Web自动化工具,一般用于测试、爬虫、刷票等场景。
三个组件:
-
Selenium IDE:浏览器插件,生成测试脚本(脚本录制),2021年已经停止更新
-
Selenium WebDriver:让代码控制浏览器模拟用户操作,自动化测试必备组件(最重要)
-
Selenium Grid:分布式扩展,让自动化脚本在多个机器上运行
特点:
-
行业标准:WebDriver成为了W3C(World Wide Web Consortium------万维网联盟)标准
-
兼容性强:
-
支持多语言:python、java、C#、ruby
-
支持多浏览器:chrome、Firefox、edge、safari
-
支持多环境:Windows、macos、Linux
-
-
生态比较成熟:
-
书籍、视频
-
Appium(App自动化测试):它对外提供的 API 与 Selenium WebDriver 几乎完全一致。如果你会 Selenium,就能非常快速地上手 Appium
-
pytest:Selenium 本身只是一个"库",它负责浏览器操作。Selenium 可以与你所能想到的所有主流测试框架完美融合,而 pytest 是 Python 语言中最流行、最强大的代表。
-
二.Selenium环境搭建
在有python环境的前提下,在终端中
pip install selenium
运行测试代码,测试是否安装成功
python
from selenium import webdriver # 导入Selenium的WebDriver模块
driver = webdriver.Chrome() # 启动Chrome浏览器
driver.get("https://www.bing.com/") # 控制浏览器访问必应网站
driver.quit() # 关闭浏览器
运行结果:
-
不报错:安装成功
-
报错:
-
找不到浏览器Chrome:电脑上没有该浏览器或者安装的浏览器不是来自官网
-
找不到浏览器驱动ChromeDriver:一般情况下,在找到浏览器后会自动安装ChromeDriver驱动。出现此错误多半是网络问题, 可以手动去安装驱动,或者更换浏览器。
-
三.Selenium应用示例
能做什么(常见):
-
一般操作:访问、点击、输入
-
上下滚动
-
左右切换
-
大小缩放(兼容性问题)
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
def selenium_example():
# 1 初始化 Edge WebDriver
print("初始化 Edge 浏览器...")
options = webdriver.EdgeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Edge(options=options)
try:
# 设置窗口大小
driver.set_window_size(1200, 800)
print("浏览器窗口已设置")
# 2 访问示例网站(避免百度复杂的反爬机制)
print("访问示例网站...")
driver.get("https://www.selenium.dev")
# 等待页面加载
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))
print("页面加载完成")
# 3 点击操作 - 点击导航菜单
print("尝试点击导航菜单...")
try:
# 尝试点击文档链接
docs_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Documentation")))
docs_link.click()
print("成功点击文档链接")
time.sleep(2)
except Exception as e:
print(f"点击文档链接失败: {e}")
# 如果点击失败,继续执行其他操作
# 4 输入文本 - 在支持输入的页面上操作
print("访问有输入框的示例页面...")
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
# 等待输入框加载
text_input = wait.until(EC.element_to_be_clickable((By.NAME, "my-text")))
print("输入框已就绪")
# 使用JavaScript设置值,避免交互问题
driver.execute_script("arguments[0].value = 'Selenium测试文本';", text_input)
print("文本输入完成")
time.sleep(1)
# 5 上下滚动
print("执行页面滚动操作...")
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
print("滚动到底部")
time.sleep(1)
# 滚动到页面顶部
driver.execute_script("window.scrollTo(0, 0);")
print("滚动到顶部")
time.sleep(1)
# 滚动到中间位置
driver.execute_script("window.scrollTo(0, 300);")
print("滚动到中间")
time.sleep(1)
# 6 点击提交按钮(使用JavaScript避免交互问题)
print("点击提交按钮...")
submit_button = driver.find_element(By.CSS_SELECTOR, "button")
driver.execute_script("arguments[0].click();", submit_button)
print("提交按钮点击完成")
time.sleep(2)
# 7 左右切换 - 访问不同页面模拟标签页切换
print("访问不同页面演示导航...")
driver.get("https://www.example.com")
print("访问example.com")
time.sleep(2)
# 执行JavaScript在新标签页打开页面
driver.execute_script("window.open('https://www.wikipedia.org', '_blank');")
print("新标签页已打开")
time.sleep(2)
# 获取所有窗口句柄并切换
windows = driver.window_handles
if len(windows) > 1:
driver.switch_to.window(windows[1])
print("切换到新标签页")
time.sleep(2)
# 在新标签页中操作
search_input = wait.until(EC.presence_of_element_located((By.NAME, "search")))
driver.execute_script("arguments[0].value = 'Python编程';", search_input)
print("在新标签页中输入文本")
time.sleep(2)
# 切换回原始标签页
driver.switch_to.window(windows[0])
print("切换回原始标签页")
time.sleep(2)
# 8 大小缩放 - 使用键盘快捷键
print("执行缩放操作...")
# 确保页面有焦点
body = driver.find_element(By.TAG_NAME, "body")
body.click()
time.sleep(1)
# 使用ActionChains进行缩放
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL).send_keys(Keys.ADD).key_up(Keys.CONTROL).perform()
print("页面放大")
time.sleep(1)
actions.key_down(Keys.CONTROL).send_keys(Keys.SUBTRACT).key_up(Keys.CONTROL).perform()
print("页面缩小")
time.sleep(1)
# 重置缩放
actions.key_down(Keys.CONTROL).send_keys('0').key_up(Keys.CONTROL).perform()
print("重置缩放")
time.sleep(1)
# 9 演示更多滚动操作
print("演示更多滚动操作...")
driver.get("https://www.selenium.dev/documentation/")
# 缓慢滚动演示
for i in range(0, 1000, 100):
driver.execute_script(f"window.scrollTo(0, {i});")
time.sleep(0.2)
print("所有操作成功完成!")
except Exception as e:
print(f"执行过程中出现错误: {e}")
# 打印更详细的错误信息
import traceback
traceback.print_exc()
finally:
# 等待一会儿然后关闭浏览器
time.sleep(3)
driver.quit()
print("Edge 浏览器已关闭")
if __name__ == "__main__":
print("使用 Edge 浏览器运行 Selenium 示例 ---")
selenium_example()

四.两大对象
**对象:**面向对象
Selenium最开始使用Java开发,几乎所有的用法都是面向对象的风格。
两大对象
-
WebDriver:浏览器操作,浏览器的驱动对象,用来和浏览器交互。
-
打开网页
-
页面跳转
-
大小调整
-
截图
-
滚动窗口
-
切换窗口
-
获取网页标题、内容、网址
-
-
WebElement:元素的操作,通过 WebDriver 找到的 页面元素对象。
-
输入
-
点击
-
截图
-
获取内容、大小、位置
-
五.八种定位
python
class By:
ID = "id" # 通过元素的id属性定位
XPATH = "xpath" # 通过元素的XPath路径表达式来定位
LINK_TEXT = "link text" # 通过超链接文本(a标签里的文字)定位
PARTIAL_LINK_TEXT = "partial link text" # 通过超链接文本的一部分定位
NAME = "name" # 通过元素的name属性定位。
TAG_NAME = "tag name" # 通过元素的HTML标签名来定位
CLASS_NAME = "class name" # 通过元素的class属性定位
CSS_SELECTOR = "css selector" # 通过CSS选择器语法定位
-
针对链接
-
LINK_TEXT
-
PARTIAL_LINK_TEXT
-
-
针对元素属性
-
ID
-
NAME
-
TAG_NAME
-
CLASS_NAME
-
-
万能方法(最常用)
-
XPATH
-
CSS_SELECTOR
-
同一个元素可以使用不同的方式进行定位。

六.三大等待
等待元素加载完成
-
强制等待:让程序固定暂停一段时间,不管元素是否加载完成。
python# 在元素定位之前,强制等待 time.sleep(2)
-
隐式等待:设置一个全局的等待时间,在查找元素时,如果元素没有立即出现,会在设定时间内不断尝试查找,直到超时。
python# 隐式等待 driver.implicitly_wait(10)
七.Selenium和pytest集成
Selenium集成pytest
pip install pytest-selenium
若文件名以test_开头则不用加文件名
pytest --driver chrome --html report.html
test_demo3.py
python
def test_web(selenium):
selenium.get("https://www.baidu.com")
assert 1==2

八.测试框架封装
-
POM 页面对象模型
POM:Page Object Model 页面对象模型。核心思想是将Web页面 抽象成一个类(Class) ,将页面上的元素定位 和元素操作封装在这个类的方法中。
-
使用对象:代表页面
-
使用对象中的属性:代表页面元素
-
使用对象中的方法:代表页面的操作
pythondef test_login_ok(selenium): page = LoginPage(selenium) # 1.实例化PO is_ok = page.login('beifan_1025','beifan_1205') # 2.调用po方法 assert True is is_ok # 3.断言
-
-
KDT 关键字驱动测试
KDT 是一种自动化测试框架或方法论 。它将测试逻辑(做什么 )与实现细节(怎么做)彻底分离。测试用例由一系列"关键字"组成,这些关键字代表最基本的操作动作。
-
关键字 :最小的、可复用的操作单元。例如
Open Browser
,Input Text
,Click Button
,Verify Text
。 -
测试数据 :与关键字配合使用的数据。例如,对于
Input Text
这个关键字,需要提供 定位器 和 要输入的文本 这两组数据。 -
驱动/引擎:这是框架的核心。它是一个解释器,负责读取关键字和测试数据,并调用对应的代码函数来执行它们。
-
测试脚本:通常以表格形式(如Excel, CSV)或特定DSL(领域特定语言)存在,它按顺序列出要执行的关键字和所需数据。
-