方法execute_script不要等待脚本结束在python中使用selenium返回值

时间:2016-02-07 11:38:45

标签: javascript python selenium

我试图使用python和selenium为Instagram制作一个机器人。 (我不是开发人员javascript或python。)

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

并使用js脚本返回来获取它。

我的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/

谢谢

1 个答案:

答案 0 :(得分:0)

根本原因是您异步调用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)