Search code examples
javascriptpythonwxpython

Inject Javascript into web page with Python


For my application I need to inject JS into the loaded url.

I am using the following snippet from here 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() 

Here I am injecting javascript with RunScript but the problem is, this javascript loads before the webpage loads. How can I load this javascript after the webpage (given url) loaded completely.

I know in plain javascript I can use document.readyState === "complete", but here how can I do it?


Solution

  • According to documentation:

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

    You should use EVT_WEBVIEW_LOADED event to check if asynchronous methods like LoadURL is completed.

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

    Complete code could look something like (not tested):

    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()