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的跨界测试》

相关推荐
想成为PhD的小提琴手6 分钟前
论文阅读11——V2V-LLM:采用多模式大型语言模型的车对车协同自动驾驶
人工智能·语言模型·自动驾驶
这里有鱼汤10 分钟前
Python模块化开发,从此告别乱糟糟的代码!
前端·后端·python
这里有鱼汤11 分钟前
高手也容易忽略的 Python 命名空间与作用域
前端·后端·python
码界筑梦坊23 分钟前
基于Spark的招聘数据预测分析推荐系统
大数据·分布式·python·信息可视化·spark·毕业设计
码界筑梦坊28 分钟前
基于FLask的大众点评美食推荐系统的设计与实现
python·信息可视化·数据分析·flask·美食
meisongqing29 分钟前
人工智能:RNN和CNN详细分析
人工智能·神经网络
带娃的IT创业者31 分钟前
《AI大模型趣味实战》智能财务助手系统架构设计
人工智能·系统架构
Shockang37 分钟前
机器学习的一百个概念(7)独热编码
人工智能·机器学习
东芃939442 分钟前
CUDA error: no kernel image is available for execution on the device
人工智能·深度学习
计算所陈老师1 小时前
基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(一)
人工智能·数据治理