用Python将JavaScript注入网页

3 投票
1 回答
5651 浏览
提问于 2025-04-18 09:15

为了我的应用程序,我需要在加载的网页中注入一些JavaScript代码。

我使用了这里的一个代码片段 https://stackoverflow.com/a/10866495/1162305

import wx 
import wx.html2 

class MyBrowser(wx.Dialog): 
  def __init__(self, *args, **kwds): 
    wx.Dialog.__init__(self, *args, **kwds) 
    sizer = wx.BoxSizer(wx.VERTICAL) 
    self.browser = wx.html2.WebView.New(self) 
    sizer.Add(self.browser, 1, wx.EXPAND, 10) 
    self.SetSizer(sizer) 
    self.SetSize((700, 700)) 

if __name__ == '__main__': 
  app = wx.App() 
  dialog = MyBrowser(None, -1) 
  dialog.browser.LoadURL("http://www.google.com") 
  dialog.Show() 
  dialog.browser.RunScript('alert("hello");')
  app.MainLoop() 

在这里,我是通过 RunScript 来注入JavaScript的,但问题是,这段JavaScript在网页加载之前就执行了。我想知道怎么才能在网页(给定的URL)完全加载后再执行这段JavaScript。

我知道在普通的JavaScript中可以使用 document.readyState === "complete" 来判断,但在这里我该怎么做呢?

1 个回答

1

根据文档的说明:

http://wxpython.org/Phoenix/docs/html/html2.WebView.html#phoenix-title-asynchronous-notifications

你应该使用 EVT_WEBVIEW_LOADED 这个事件来检查像 LoadURL 这样的异步方法是否完成了。

self.Bind(wx.html2.EVT_WEBVIEW_LOADED, self.OnWebViewLoaded, self.browser)

完整的代码可能看起来像这样(未经过测试):

import wx 
import wx.html2 

class MyBrowser(wx.Dialog): 
  def __init__(self, *args, **kwds): 
    wx.Dialog.__init__(self, *args, **kwds) 
    sizer = wx.BoxSizer(wx.VERTICAL) 
    self.browser = wx.html2.WebView.New(self) 
    sizer.Add(self.browser, 1, wx.EXPAND, 10) 
    self.Bind(wx.html2.EVT_WEBVIEW_LOADED, self.OnWebViewLoaded, self.browser)
    self.SetSizer(sizer) 
    self.SetSize((700, 700))

  def OnWebViewLoaded(self, evt):
    # The full document has loaded
    self.browser.RunScript('alert("hello");')

if __name__ == '__main__': 
  app = wx.App() 
  dialog = MyBrowser(None, -1) 
  dialog.browser.LoadURL("http://www.google.com") 
  dialog.Show() 
  app.MainLoop() 

撰写回答