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
相关产品推荐
相关产品推荐

