Gavin Matthew 2021-04-16 21:45 采纳率: 25%
浏览 634
已采纳

selenium获取javascript函数中局部变量的值(selenium获取js)

一、问题说明

我用python selenium 执行 js 代码,需要用 js 执行的返回值 在 selenium 其他地方使用。

(我这里是想把 js 获取的 视频时长 传给 selenium 用以 time.sleep(视频时长) 延迟后(即播放完视频)自动播放下一个)

因此我的思路是:通过 局部变量 把 js函数内部的值 赋予全局变量, 然后 return 全局变量。

现在问题是所需要的值在函数内部获取到了,但是传不出来,即 return 出来的是 None。

二、尝试的方法

在 函数内部 var ,return 就找不到;

在 函数外定义 var, return 的就是函数外的,

通过 window 也没起作用。

三、错误代码、软件版本(python3, Chrome)

 

四、相关代码

js_play_end = '''
                    var video = document.getElementById("video_html5_api");
                    var _duration = 3.14;
                    var i = setInterval(function(){
                        if(video.readyState > 0){
                            console.log("111");
                            console.log("视频时长: "+Math.floor(video.duration/60)+"分钟"+Math.ceil(video.duration%60)+"秒");
                            console.log("222");
                            console.log(video.duration);
                            clearInterval(i);
                        }
                        window._duration = video.duration;
                        console.log(window._duration);
                        return window._duration;
                    }, 200);
                    
                    return _duration;
                    
                    video.addEventListener("ended", function () {
                        console.log("本章播放结束,开始下一章");
                        var par_iframe = window.parent;
                        var par_par_iframe = par_iframe.parent;
                        var _div_2 = par_par_iframe.document.getElementById("right2");
                        var _div_1 = par_par_iframe.document.getElementById("right1");
                        _div_2.click();
                        _div_1.click();
                    }, false);
                '''
                # js_play_end = 'return document.getElementsByClassName("vjs-duration-display");'
                _duration = browser.execute_script(js_play_end)
                print(_duration)
                time.sleep(300)
                # time.sleep(float(video_duration)+5)

  • 写回答

3条回答 默认 最新

  • 关注

    这个需要延时获取

     

    js_play_end = '''
        var video = document.getElementById("video_html5_api");
        var _duration = 3.14;
        var i = setInterval(function(){
            if(video.readyState > 0){
                console.log("111");
                console.log("视频时长: "+Math.floor(video.duration/60)+"分钟"+Math.ceil(video.duration%60)+"秒");
                console.log("222");
                console.log(video.duration);
                window._duration = video.duration;
                console.log(window._duration);
                clearInterval(i);
            }
        }, 200);
    '''
    browser.execute_script(js_play_end)
    
    _duration = None
    while _duration == None:
        time.sleep(1)
        _duration = browser.execute_script('''
            return window._duration;
        ''')
    print(_duration)
    time.sleep(300)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 多尺度特征图提取和融合
  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥20 小规模孤立词识别系统设计
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪
  • ¥15 esp8266 tally灯 接收端改为发射端
  • ¥30 Labview代码调用access 数据库,相同代码其中一个调用不出来是为什么