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

Selenium driver.execute_script()无法返回值,如何获取目标HTML元素?

解决Selenium execute_script返回None及变量无法跨调用访问的问题

为什么拆分执行JS会报错?

每次调用driver.execute_script()都会创建独立的JavaScript执行上下文,上下文内定义的变量(比如你写的data)不会在多次调用之间保留,所以第二次调用时找不到data变量,才会触发“Type not found”错误。

解决方案

1. 单次执行完整脚本+确保元素已加载

你的第一个脚本返回None,大概率是执行脚本时目标元素还没渲染完成。可以结合Selenium的显式等待,先等元素加载再执行JS:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 最多等待10秒,直到目标元素出现在DOM中
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".assignment__row.break-word.clickable.flex--space-between.ng-star-inserted"))
)

# 执行完整JS脚本获取元素
the_script = """
var data = document.getElementsByClassName("assignment__row break-word clickable flex--space-between ng-star-inserted");
return data[0];
"""
result = driver.execute_script(the_script)
# 若成功获取元素,直接提取HTML内容
if result:
    html_content = result.get_attribute('outerHTML')
    print(html_content)

2. 挂载变量到window对象实现跨调用共享

如果必须拆分执行JS,可以把变量绑定到全局window对象上,让不同的execute_script调用共享这个变量:

# 第一次执行,将结果存入全局window.data
driver.execute_script("window.data = document.getElementsByClassName('assignment__row break-word clickable flex--space-between ng-star-inserted');")
# 第二次执行,从window.data中提取元素
result = driver.execute_script("return window.data[0];")
if result:
    print(result.get_attribute('outerHTML'))

3. 用Selenium原生方法定位元素(更推荐)

非必要场景优先用Selenium自带的元素定位方法,代码更简洁易维护:

from selenium.webdriver.common.by import By

# 用CSS选择器定位多类名元素(类名前加.,用点连接)
element = driver.find_element(By.CSS_SELECTOR, ".assignment__row.break-word.clickable.flex--space-between.ng-star-inserted")
# 获取元素完整HTML内容
html_content = element.get_attribute('outerHTML')
print(html_content)

如果元素加载较慢,同样可以搭配前面的显式等待逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:50:18