4

当我尝试browser.ExecuteJavascript("alert('ExecuteJavaScript works!');")它工作正常(创建浏览器时弹出警报)。当我尝试browser.ExecuteJavascript("document.getElementsByName('q')[0].value = 24;")没有任何反应。所以我知道 ExecuteJavascript 正在工作,但是当我尝试设置输入元素的值时,为什么输入元素没有改变?我正在尝试的代码如下,如果有人知道为什么那个特定的 Javascript 不会执行,我将不胜感激。

from cefpython3 import cefpython as cef
import platform
import sys

def main():
    sys.excepthook = cef.ExceptHook
    cef.Initialize()
    browser = cef.CreateBrowserSync(url="https://www.google.com", window_title="Hello World!")
    browser.ExecuteJavascript("document.getElementsByName('q')[0].value = 24")
    cef.MessageLoop()
    cef.Shutdown()

if __name__ == '__main__':
    main()
4

1 回答 1

8

刚刚创建浏览器后,DOM 还没有准备好。使用鼠标上下文菜单打开开发人员工具窗口,您将看到错误。您应该使用 LoadHandler 来检测窗口何时完成网页加载或 DOM 何时准备就绪。选项:

  1. 实现 LoadHandler.OnLoadingStateChange:

    main():
        browser.SetClientHandler(LoadHandler())

    class LoadHandler(object):
        def OnLoadingStateChange(self, browser, is_loading, **_):
            if not is_loading:
                browser.ExecuteJavascript("document.getElementsByName('q')[0].value = 24")
  1. 实现 LoadHandler.OnLoadStart 并注入添加事件侦听器 DOMContentLoaded 的 js 代码,该事件侦听器将执行实际代码。

请参阅教程 > 客户端处理程序: https ://github.com/cztomczak/cefpython/blob/master/docs/Tutorial.md#client-handlers

另请参阅 LoadHandler 的 API 参考。

于 2017-05-03T05:44:17.043 回答