使用Selenium Chrome切换about:Blank新标签页的报错与检测问题
问题分析与修复方案
核心错误原因
wait = time.sleep(2):time.sleep()函数返回None,后续调用wait.until()必然触发AttributeError,这是直接报错的根源。- 重复导入模块:多次导入
webdriver和WebDriverWait,属于冗余代码。 - 配置无效:在初始化
driver之后才设置ChromeOptions,此时配置不会生效,因为driver已经创建完成。 - 等待逻辑重复且不完善:重复执行窗口数量等待,未处理
about:blank的过渡加载状态。
修复后的完整代码
from seleniumbase import Driver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time URL = 'https://www.fedex.com/fedextrack/?trknbr=123456789012&trkqual=2460234000~123456789012~FX' # 提前配置下载参数,初始化driver时生效 download_options = { "download.default_directory": r"C:\Users\User1\Downloads\BPAAS", "download.prompt_for_download": True, "download.directory_upgrade": True, "safebrowsing.enabled": True } # 初始化driver并传入配置 driver = Driver(uc=True, external_pdf=True, chrome_options=download_options) driver.get(URL) driver.maximize_window() # 正确创建WebDriverWait实例 wait = WebDriverWait(driver, 10) # 点击"获取凭证"按钮 wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="obtain-proof-link-id"]'))).click() time.sleep(1) # 短等待确保页面状态更新 # 记录原始窗口句柄,点击"查看PDF"按钮 original_window = driver.current_window_handle wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[class="fdx-c-button fdx-c-button--primary fdx-c-button--responsive fdx-u-pt--4 fdx-u-pb--4"]'))).click() # 处理新窗口切换,适配about:blank过渡状态 try: # 延长超时时间,等待窗口数量变为2 wait.until(EC.number_of_windows_to_be(2)) # 遍历切换到非原始窗口 for window_handle in driver.window_handles: if window_handle != original_window: driver.switch_to.window(window_handle) # 等待PDF页面实际加载完成,避免停留在about:blank wait.until(EC.url_contains("fedex")) break except Exception as e: print(f"切换窗口失败: {e}") print(driver.current_url) driver.quit()
关键修复点说明
- 修正Wait实例:替换错误的
wait = time.sleep(2),创建有效的WebDriverWait实例用于显式等待。 - 提前配置选项:在初始化
driver前设置下载参数,通过chrome_options传入确保配置生效。 - 优化等待逻辑:延长超时时间,添加PDF页面URL的等待判断,处理
about:blank的过渡加载状态。 - 清理冗余代码:删除重复导入的模块,简化代码结构。
内容的提问来源于stack exchange,提问作者Knockoutpie
相关产品推荐
相关产品推荐

