【问题标题】:method execute_script don't wait end of script to return value with selenium in python方法execute_script不要等待脚本结束在python中使用硒返回值
【发布时间】:2016-02-07 11:38:45
【问题描述】:

我正在尝试使用 python 和 selenium 为 instagram 创建一个机器人。 (我不是开发者 javascript 或 python。)

无论如何,我想在execute_script中返回一个带有js的用户数组。

并在 js 脚本中通过 return 获取它。

我的python代码:

ole = []
ole = driver.execute_script("dd = document.getElementsByClassName(\"_8mlbc _t5r8b\"); i = 9; ret = []; before = 0; function need_up() { before = document.getElementsByClassName(\"_4zhc5 _ook48\")[0].title; } function loveu() { if (i == dd.length){return ret;} dd[i].click(); b = setTimeout(need_up, 300);ret.push(before); i++; a = setTimeout(loveu, 400);} return loveu();")

为了便于阅读,这里是缩进的 javascript 代码:

dd = document.getElementsByClassName("_8mlbc _t5r8b");
i = 9;
ret = [];
before = 0;
function get_name_user() { 
    before = document.getElementsByClassName("_4zhc5 _ook48")[0].title;
     } 
function get_array_user() 
{ 
    if (i == dd.length){
        return ret;
    } 
    dd[i].click();
    b = setTimeout(get_name_user, 500);
    ret.push(before);
    i++;
    a = setTimeout(get_array_user, 500);
} 
get_array_user();
return ret;

您可以在此网址上尝试此代码(例如),它在 firefox 上有效:https://www.instagram.com/explore/tags/happy/

谢谢

【问题讨论】:

  • 您的确切问题是什么?
  • 你异步调用 get_array_user(),所以它不会等待递归的结果。如果要等待递归,则需要使用回调函数。
  • 对不起,我的问题实际上是当我尝试返回我的代码 JS 时,我的数组为空,因为我的脚本在 ole = driver.execute_script 之后运行。

标签: javascript python selenium


【解决方案1】:

根本原因是你异步调用a = setTimeout(loveu, 400);,所以它立即返回。我认为您需要阅读如何使用 setTimeout http://javascript.info/tutorial/settimeout-setinterval

我已通过调用a = loveu(); 而不是a = setTimeout(loveu, 400); 修改了您的代码并将其移至function need_up()

ole = []
script = """
        dd = document.getElementsByClassName("_8mlbc _t5r8b");
        i = 9; ret = []; before = 0;
        function need_up() {
            before = document.getElementsByClassName("_4zhc5 _ook48")[0].title;
            ret.push(before);
            i++;
            a = loveu();
        }
        function loveu() {
            if (i == dd.length){return ret;}
            dd[i].click();
            b = setTimeout(need_up, 5000);
        }
        return loveu();
        """
ole = driver.execute_script(script)

【讨论】:

  • @Fantasim 如果我的回答可以解决您的问题,请点击接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多