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

Selenium调用scrollHeight报错:Cannot read properties of null (reading 'scrollHeight')

解决Selenium中document.querySelector('.zxU94d')返回null的问题

问题原因分析

  • 页面加载不完整:driver.get(url)仅等待页面初始HTML加载完成,Google Jobs的动态内容(目标元素)可能还未渲染完毕,此时执行查询会返回null。
  • 无头模式环境差异:Chrome无头模式的渲染逻辑与正常浏览器不同,可能导致动态元素加载延迟或类名/结构变化。
  • 元素类名动态更新:Google页面的元素类名经常会调整,教程中的.zxU94d可能已失效。
  • 反爬机制限制:Google识别到无头浏览器后,可能限制内容加载,导致目标元素无法正常渲染。

解决方案

1. 显式等待元素加载

使用WebDriverWait等待目标元素出现后再执行操作,确保元素已渲染完成:

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

def scroll_page(url):
    service = Service(ChromeDriverManager().install())
    
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")  # 新版无头模式更接近正常浏览器
    options.add_argument('--lang=en')
    options.add_argument("user-agent=AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36")

    driver = webdriver.Chrome(service=service, options=options)
    driver.get(url)
    
    try:
        # 等待目标元素出现,最长等待10秒
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.zxU94d'))
        )
        old_height = driver.execute_script("return document.querySelector('.zxU94d').scrollHeight")
        print(old_height)
    except Exception as e:
        print(f"元素加载超时或未找到: {e}")
    finally:
        driver.quit()

2. 优化无头浏览器参数

添加更多参数模拟正常浏览器环境,避免被反爬识别:

options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
options.add_argument('--lang=en')
options.add_argument("user-agent=AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36")
# 补充模拟参数
options.add_argument("--window-size=1920,1080")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

3. 更换稳定的元素选择器

如果.zxU94d类名失效,尝试通过元素功能属性或层级结构定位:

# 示例:通过职位列表容器的特征定位
old_height = driver.execute_script("""
const scrollContainer = document.querySelector('[role="main"] .gws-plugins-horizon-jobs__job-list');
return scrollContainer ? scrollContainer.scrollHeight : null;
""")

4. 触发内容加载后再查询

模拟简单交互触发动态内容加载,再执行元素查询:

driver.get(url)
# 模拟页面滚动触发内容加载
driver.execute_script("window.scrollTo(0, 200);")
# 等待内容渲染
driver.implicitly_wait(5)
old_height = driver.execute_script("return document.querySelector('.zxU94d')?.scrollHeight")

内容的提问来源于stack exchange,提问作者Chiffon Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:25:32