【问题标题】:How to call the callback function within selenium execute_async_script from python如何从 python 调用 selenium execute_async_script 中的回调函数
【发布时间】:2018-04-18 01:46:12
【问题描述】:

我正在抓取一个网站,网页正在播放音频,我想知道音频何时播放完毕,所以我将事件侦听器添加到音频 webElement 以监视“onEnded”事件是否触发,我想从 driver.execute_async_script 中的 callback() 函数中得到注意。

但我总是出错

TypeError: <function MissionContentItemHelper.audio_play_end at 0x10f3b7b70> is not JSON serializable.

我的问题是:

1.arguments[arguments.length - 1] 是指 self.audio_play_end 吗?

2.为什么错误输出是关于'MissionContentItemHelper.audio_play_end is not JSON serializable'?我在 MissionContentItemHelper.audio_play_end 和 JSON 之间看不到任何线索。

3.调用audio_play_end的方式正确吗?

class MissionContentItemHelper: 
    def sleep(self):
        audio = self.browser.find_element_by_css_selector('#audio')
        self.browser.execute_async_script("""
            var audio = arguments[0];
            callback = arguments[arguments.length - 1];
            audio.addEventListener("ended", function(_event) {
                callback();
            }
        """, audio, self.audio_play_end)

    @staticmethod
    def audio_play_end():
        print('the audio finished playing...')

【问题讨论】:

    标签: python selenium scrapy


    【解决方案1】:

    execute_async_script 的名字让很多人感到困惑。它不会从您的测试代码异步执行脚本,它只允许您执行从浏览器的主线程异步运行的脚本,例如 AJAX 调用和 JavaScript setTimeout

    这些 JavaScript 函数和类似的函数本身几乎立即返回,但它们采用 (JavaScript) 函数参数,该参数在异步操作完成时执行。 execute_async_script 所做的与 execute_script 完全一样,但不是在函数本身返回时返回(几乎是立即返回),而是提供了自己的回调 JavaScript 函数(它作为最后一个参数传递,这就是为什么 arguments[arguments.length - 1] 是需要),您可以在传递给execute_async_script 的JavaScript 代码中使用它,将其作为回调传递给异步函数。 execute_async_script 仅在调用此回调时返回,而不是立即返回。

    例如,在以下代码中,对execute_async_script 的调用相当于延迟了 2 秒:

    browser.execute_async_script("setTimeout(arguments[0], 2000)")

    请注意,因为我没有向脚本传递任何其他参数,所以arguments[0] 实际上是最后一个参数。

    在您的情况下,您不必传递 self.audio_play_end,但您必须在 JavaScript sn-p 中调用 audio.play() 才能启动音频。 execute_async_script 应该仅在音频播放完毕后返回。

    【讨论】:

      猜你喜欢
      • 2019-09-06
      • 2016-02-02
      • 2021-06-05
      • 2012-04-22
      • 2021-01-02
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2017-11-13
      相关资源
      最近更新 更多