如何为Selenium实现的Scraper类accept_cookies方法编写单元测试
我在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()
关键改进说明
- 测试结构优化:用
setUp和tearDown自动管理浏览器生命周期,避免重复代码和资源泄漏。 - 有效验证逻辑:
- 通过检查网站生成的Cookie标记(
OptanonAlertBoxClosed)确认同意操作生效; - 通过判断原弹窗按钮是否消失/不可见,验证界面状态变化。
- 通过检查网站生成的Cookie标记(
- 可靠性提升:替换原代码中的
time.sleep为WebDriverWait,等待逻辑更精准,避免因网络延迟导致的误判。
内容的提问来源于stack exchange,提问作者Lewis-010
相关产品推荐
相关产品推荐

