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

Selenium爬取雅虎财经资产负债表时遇ElementClickInterceptedException异常求助

问题原因与解决方案

异常原因分析

你遇到的ElementClickInterceptedException本质是:目标按钮被一个模态遮罩层(lightbox-wrapper类的div)遮挡,导致点击事件被遮罩层拦截,无法触发到目标按钮上。

具体触发的诱因是代码逻辑的问题:

  • 每次调用clickButtonByText都会执行driver.get(url)重复加载页面。第一次加载页面时可能没有弹出遮罩,但第二次加载时,雅虎财经会触发隐私政策弹窗、广告弹窗或者反爬验证遮罩,这个遮罩层的层级(Z(50))比按钮更高,完全覆盖了按钮区域。
  • 虽然两个按钮的HTML结构一致,但第二次加载页面时的页面状态(存在遮罩)和第一次不同,所以出现了之前没有的拦截问题。

修复方案

1. 避免重复加载页面

不要每次点击按钮都重新请求页面,第一次加载后留在当前页面操作即可,修改clickButtonByText函数去掉重复的driver.get(url):

# 修改后的点击函数:仅在首次调用时加载页面,后续直接操作当前页面
def clickButtonByText(driver, button_text):
    # 等待按钮可点击
    button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, f'//button[@aria-label="{button_text}"]'))
    )
    # 先检查是否有遮罩层,有则关闭(示例逻辑,需根据实际弹窗调整)
    try:
        lightbox = WebDriverWait(driver, 3).until(
            EC.presence_of_element_located((By.CLASS_NAME, 'lightbox-wrapper'))
        )
        # 尝试点击遮罩层的关闭按钮(比如X按钮,需根据实际HTML调整定位)
        close_btn = lightbox.find_element(By.XPATH, './/button[@aria-label="Close"]')
        close_btn.click()
        # 等待遮罩消失
        WebDriverWait(driver, 5).until(EC.staleness_of(lightbox))
    except:
        # 没有遮罩则跳过
        pass
    # 执行点击
    button.click()
    # 用显式等待代替time.sleep,等待页面更新
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, f'//div[text()="{button_text}"]/following-sibling::div'))
    )
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    return soup

然后修改调用逻辑,只加载一次页面:

def readBalanceSheetRow():
    driver = getDriver()
    # 仅加载一次页面
    driver.get('https://finance.yahoo.com/quote/MSFT/balance-sheet?p=MSFT')
    
    # 点击Total Assets
    html_response = clickButtonByText(driver, 'Total Assets')
    
    # 点击Total Liabilities Net Minority Interest
    html_response_two = clickButtonByText(driver, 'Total Liabilities Net Minority Interest')

2. 用JavaScript点击绕过拦截

如果遮罩层无法通过常规方式关闭,可以直接用JS代码强制点击目标元素,绕过元素遮挡的问题:

def clickButtonByText(driver, button_text):
    button = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, f'//button[@aria-label="{button_text}"]'))
    )
    # 用JS执行点击
    driver.execute_script("arguments[0].click();", button)
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, f'//div[text()="{button_text}"]/following-sibling::div'))
    )
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    return soup

3. 处理隐私政策弹窗

雅虎财经首次加载或重复加载时,经常会弹出隐私同意弹窗,你可以在页面加载后先处理这个弹窗:

def handle_privacy_popup(driver):
    try:
        # 定位同意按钮(需根据实际弹窗元素调整)
        accept_btn = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable((By.XPATH, '//button[text()="Accept All"]'))
        )
        accept_btn.click()
    except:
        pass

def readBalanceSheetRow():
    driver = getDriver()
    driver.get('https://finance.yahoo.com/quote/MSFT/balance-sheet?p=MSFT')
    handle_privacy_popup(driver)
    
    html_response = clickButtonByText(driver, 'Total Assets')
    html_response_two = clickButtonByText(driver, 'Total Liabilities Net Minority Interest')

内容的提问来源于stack exchange,提问作者AJ Goudel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:27:11