一、DrissionPage核心优势回顾
作为新一代网络自动化工具,DrissionPage具备以下核心能力:
-
无驱化浏览器:无需独立WebDriver
-
混合模式:支持HTTP请求与浏览器渲染无缝切换
-
智能等待:自动处理动态加载内容
-
多协议支持:HTTP/WebSocket/WebRTC全覆盖
二、高级爬虫技巧实战
2.1 动态内容精准捕获
python
from DrissionPage import SessionPage
page = SessionPage()
page.get('https://example.com')
# 显式等待元素加载
element = page.wait.ele_loaded('tag:div@class=dynamic-content', timeout=10)
# 滚动加载处理
page.scroll.to_see(element) # 滚动到元素可见位置
page.scroll.to_bottom(times=3) # 模拟用户滚动到底部3次
2.2 复杂反爬场景应对
python
# 指纹伪装
page.set.user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64)')
page.set.cookies({'key': 'value'})
# IP轮询代理池
proxies = [
'http://proxy1:port',
'http://proxy2:port'
]
page.set.proxies(proxies, mode='round_robin')
# 验证码自动处理(需集成第三方服务)
page.ele('@id=captcha_img').click()
if captcha := page.wait.ele_loaded('@id=captcha_input'):
captcha.input(get_captcha_by_api(captcha.img))
2.3 数据管道构建
python
import pandas as pd
from DrissionPage import SessionPage
class DataPipeline:
def __init__(self):
self.page = SessionPage()
self.df = pd.DataFrame(columns=['Title', 'Price'])
def scrape_page(self, url):
self.page.get(url)
items = self.page.eles('.product-item')
for item in items:
title = item.ele('.title').text
price = item.ele('.price').text
self.df = self.df.append({'Title': title, 'Price': price})
return self.df
# 示例使用
pipeline = DataPipeline()
for page_num in range(1, 6):
url = f'https://example.com/products?page={page_num}'
pipeline.scrape_page(url)
pipeline.df.to_csv('products.csv', index=False)
三、自动化测试深度应用
3.1 测试框架集成
python
import unittest
from DrissionPage import WebPage
class EcommerceTest(unittest.TestCase):
def setUp(self):
self.page = WebPage()
self.page.get('https://shop.example.com')
def test_login_flow(self):
# 测试登录功能
self.page.ele('@id=username').input('test_user')
self.page.ele('@id=password').input('password123')
self.page.ele('@text=登录').click()
# 断言登录成功
welcome = self.page.wait.ele_loaded('.welcome-msg', timeout=5)
self.assertIsNotNone(welcome)
def tearDown(self):
self.page.quit()
if __name__ == '__main__':
unittest.main()
3.2 关键测试类型实现
3.2.1 UI回归测试
python
# 页面元素快照对比
def test_page_snapshot():
page = WebPage()
page.get('https://example.com')
current_snapshot = page.html
# 与基准快照对比
with open('baseline.html') as f:
baseline = f.read()
assert diff(baseline, current_snapshot) < 0.05 # 允许5%差异
3.2.2 API接口测试
python
# 混合模式测试
def test_api_response():
page = SessionPage()
# 直接发送API请求
resp = page.post(
url='https://api.example.com/login',
data={'user': 'test', 'pwd': '123'}
)
# 验证响应
assert resp.status_code == 200
assert 'token' in resp.json()
# 使用返回token进行UI操作
page.cookies.set('auth_token', resp.json()['token'])
page.get('https://example.com/dashboard')
assert 'Welcome' in page.ele('.header').text
3.2.3 性能基准测试
python
from timeit import timeit
def test_page_load_performance():
page = WebPage()
def load_page():
page.get('https://example.com')
page.wait.load_complete()
# 测试页面加载时间
avg_time = timeit(load_page, number=5) / 5
assert avg_time < 2.0 # 平均加载时间应小于2秒
四、企业级解决方案
4.1 分布式测试架构
mermaid:
graph TD A[Jenkins Master] --> B[Node 1] A --> C[Node 2] A --> D[Node 3] B --> E[DrissionPage Cluster] C --> E D --> E
4.2 持续集成流水线
yaml:
python
# Jenkinsfile示例
pipeline {
agent any
stages {
stage('Test') {
parallel {
stage('UI Test') {
steps {
sh 'python -m pytest ui_tests/'
}
}
stage('API Test') {
steps {
sh 'python -m pytest api_tests/'
}
}
}
}
stage('Report') {
steps {
publishHTML(
target: [allowMissing: false,
keepAll: true,
reportDir: 'reports',
reportFiles: 'report.html',
reportName: 'HTML Report']
)
}
}
}
}
五、性能优化指南
5.1 浏览器实例复用
python
from DrissionPage import ChromiumOptions
# 共享浏览器配置
co = ChromiumOptions().set_local_port(9222)
browser = co.ignore_certificate_errors().headless(False).connect()
# 多页面并行
tab1 = browser.new_tab()
tab2 = browser.new_tab()
5.2 请求优化策略
策略 | 实现方法 | 效果提升 |
---|---|---|
缓存复用 | page.set.cache(True) |
请求减少40% |
DNS预取 | page.run_js('dns-prefetch') |
加载速度+15% |
连接复用 | page.set.keep_alive(True) |
TCP开销减少70% |
六、安全与监控
6.1 安全防护方案
python
# 流量审计
page.on_request = lambda req: audit_request(req)
page.on_response = lambda res: audit_response(res)
# XSS检测
page.scripts.execute('alert = function() {}') # 禁用弹窗
assert not page.alert_exists # 验证无危险弹窗
6.2 监控告警集成
python
from prometheus_client import Gauge
# 定义监控指标
PAGE_LOAD_TIME = Gauge('page_load_time', 'Page load time in seconds')
def monitor_performance():
start = time.time()
page.get(url)
load_time = time.time() - start
PAGE_LOAD_TIME.set(load_time)
if load_time > 5:
send_alert(f'Slow loading: {url}')
七、扩展生态建设
7.1 常用插件推荐
插件名称 | 功能 | 安装方式 |
---|---|---|
drissionpage-recaptcha | 谷歌验证码破解 | pip install drissionpage-recaptcha |
dp-ocr | 图像文字识别 | pip install dp-ocr |
dp-report | 测试报告生成 | pip install dp-report |
7.2 自定义扩展开发
python
from DrissionPage import WebPage
class CustomPage(WebPage):
def screenshot_full_page(self):
"""整页截图功能扩展"""
self.scroll.to_top()
self.driver.execute_script("document.body.style.overflow = 'hidden'")
return self.screenshot()
def clean_up(self):
"""自定义清理逻辑"""
self.delete_all_cookies()
self.quit()
八、最佳实践总结
-
环境隔离:为不同项目创建独立配置
-
失败重试:重要操作添加自动重试机制
-
日志管理:分级记录操作日志
-
版本控制:锁定DrissionPage版本号
-
代码审查:定期Review自动化脚本
企业级模板仓库 :https://github.com/drissionpage/enterprise-template
官方文档 :DrissionPage Docs
下期预告:《DrissionPage移动端自动化:从H5到原生App的跨界测试》