You need to enable JavaScript to run this app. 如何通过Python Selenium WebDriver获取JavaScript执行返回值
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python Selenium WebDriver获取JavaScript执行返回值

Selenium执行外部JS文件获取返回值的解决方案

问题根因

  • 原始JS代码使用$(document).ready()包裹逻辑,回调函数内部的返回值不会被Selenium的execute_script捕获,默认返回None
  • 原始JS没有顶层return语句,execute_script只会将JS脚本顶层返回的内容传回Python,无顶层返回时默认返回None
  • 搭配WebDriverWait使用时,若脚本返回None会被判定为条件不满足,持续等待直到超时抛出TimeoutException

正确修改方案

核心修改要点

  • 移除$(document).ready()封装:Selenium执行driver.get()默认会等待页面DOM加载完成后再执行后续代码,无需额外监听ready事件
  • 将逻辑封装为立即执行函数表达式(IIFE):函数定义完成后直接加()触发执行
  • 顶层添加return语句:将函数执行结果直接返回给Selenium

修改后可正常运行的JS代码

return function cleanText() {
  // Collect the text within the nested <p> tags
  var text = [];

  // get all nested <p> tags
  let paragraphs = $(`div#id div[data-test-id=value] p`);

  // Replace all whitespaces with a single white space
  paragraphs.each(function(index) {
    let original_text = $(this).text();
    let cleaned_text = original_text.trim().replace(/\s\s+/g, ' ');
    $(this).text(cleaned_text);
    text.push(cleaned_text);
  });

  return text;
}();

Python侧调用方式

直接执行脚本即可拿到返回值,无需额外拼接逻辑:

text = driver.execute_script(script)

如果目标p标签是页面加载完成后动态渲染的,可以使用带等待的写法:

text = WebDriverWait(driver, 20).until(lambda driver: driver.execute_script(script))

额外注意事项

  • 确保目标页面已加载jQuery,否则$符号会报错。如果页面未自带jQuery,可以将选择器替换为原生JS写法,无需依赖第三方库:
    把let paragraphs = $(div#id div[data-test-id=value] p);替换为let paragraphs = document.querySelectorAll('div#id div[data-test-id=value] p');,后续遍历改用paragraphs.forEach()即可
  • 若要在Python侧动态拼接return语句,无需在JS文件内写顶层return,直接调用driver.execute_script(f'return {script}')即可,两种写法二选一,不要重复加return

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 10:27:03