DrissionPage高级技巧:从爬虫到自动化测试

一、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()

八、最佳实践总结

  1. 环境隔离:为不同项目创建独立配置

  2. 失败重试:重要操作添加自动重试机制

  3. 日志管理:分级记录操作日志

  4. 版本控制:锁定DrissionPage版本号

  5. 代码审查:定期Review自动化脚本

企业级模板仓库https://github.com/drissionpage/enterprise-template
官方文档DrissionPage Docs


下期预告:《DrissionPage移动端自动化:从H5到原生App的跨界测试》

相关推荐
思陌Ai算法定制3 小时前
【心血管影像AI预测预后】心肌梗死后心脏MRI如何更早识别高风险患者?
人工智能·影像组学·心血管影像·心脏mri·心肌梗死·stemi·微循环阻塞
大蚂蚁2号3 小时前
本地批量音视频转文本免费工具
python·音视频·开源软件
云烟成雨TD3 小时前
Agent Scope Java 2.x 系列【6】消息层
java·人工智能·agent
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【74】Agentic RAG 与混合 RAG
java·人工智能·spring
Tiansan66663 小时前
郑州AI问答推广:2家优质服务商剖析
人工智能·郑州ai问答推广2家
“码”力全开3 小时前
解耦异构算力:基于 Docker 与边缘计算的 GB28181/RTSP 企业级 AI 视频管理平台架构设计(含源码交付)
人工智能·docker·边缘计算
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【79】图执行生命周期的可观测性基础设施
java·人工智能·spring
kishu_iOS&AI3 小时前
LLM —— Milvmus向量数据库
数据库·人工智能·milvus
celiahul3 小时前
结构化内容:让网站同时适配搜索引擎与 AI 工具
人工智能·搜索引擎
qq_8573058193 小时前
OpenCV入门
人工智能·opencv·计算机视觉