You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Selenium实现的Scraper类accept_cookies方法编写单元测试

如何为Selenium的Cookie同意方法编写单元测试?

我在crypto.py文件中编写了一个使用Selenium的Scraper类,用于爬取crypto.com的数据。想在单独的crypto_test.py文件中为其中的accept_cookies方法编写单元测试——该方法用于点击crypto.com首页的“同意Cookie”按钮。目前已编写了部分测试代码,但不知道如何验证该方法是否正常工作,求帮助(我是Python新手)。


现有代码

crypto.py中的Scraper类:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import time

class Scraper():
    def __init__(self):
        self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

    def accept_cookies(self):
        driver = self.driver
        driver.get('https://crypto.com/eea')
        driver.maximize_window()
        try:
            # 等待Cookie按钮可点击并点击
            WebDriverWait(driver, 5).until(
                EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler"))
            ).click()
        except TimeoutException:
            print('Cookie按钮加载超时。')

初始crypto_test.py测试代码:

import crypto
import unittest

Crypto = crypto.Scraper()

class TestCrypto(unittest.TestCase): 
    def test_accept_cookies(self):
        self.assert(Crypto.accept_cookies)

修正后的测试方案

你的初始测试仅检查方法对象是否存在,并未实际调用方法或验证操作效果。以下是可验证accept_cookies方法有效性的完整测试代码:

import crypto
import unittest
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

class TestCrypto(unittest.TestCase): 
    def setUp(self):
        # 每个测试前初始化Scraper实例,启动浏览器
        self.scraper = crypto.Scraper()

    def tearDown(self):
        # 每个测试后关闭浏览器,释放资源
        self.scraper.driver.quit()

    def test_accept_cookies(self):
        # 调用待测试的方法
        self.scraper.accept_cookies()
        
        # 验证方式1:检查是否生成同意Cookie的标记
        cookies = self.scraper.driver.get_cookies()
        # 查找onetrust框架设置的同意标记Cookie
        has_accepted = any(cookie['name'] == 'OptanonAlertBoxClosed' for cookie in cookies)
        self.assertTrue(has_accepted, "Cookie同意操作未生效")

        # 验证方式2:检查Cookie弹窗是否已消失
        try:
            cookie_button = WebDriverWait(self.scraper.driver, 3).until(
                EC.presence_of_element_located((By.ID, "onetrust-accept-btn-handler"))
            )
            # 若按钮仍可见,说明未点击成功
            self.assertFalse(cookie_button.is_displayed(), "Cookie弹窗未关闭")
        except TimeoutException:
            # 超时说明按钮已消失,验证通过
            pass

if __name__ == '__main__':
    unittest.main()

关键改进说明

  1. 测试结构优化:用setUp和tearDown自动管理浏览器生命周期,避免重复代码和资源泄漏。
  2. 有效验证逻辑:
    • 通过检查网站生成的Cookie标记(OptanonAlertBoxClosed)确认同意操作生效;
    • 通过判断原弹窗按钮是否消失/不可见,验证界面状态变化。
  3. 可靠性提升:替换原代码中的time.sleep为WebDriverWait,等待逻辑更精准,避免因网络延迟导致的误判。

内容的提问来源于stack exchange,提问作者Lewis-010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:25:38