How can I use jQuery with selenium execute_script method?

后端 未结 2 557
醉酒成梦
醉酒成梦 2020-12-22 06:12

How can I use jQuery with the selenium execute_script method, if the current page isn\'t already using jQuery?

For example:

from seleniu         


        
相关标签:
2条回答
  • 2020-12-22 06:55

    You have two mistakes:

    • getElementsByTagName instead of findElementsByTag
    • you have to put it in triple """ """ or you have to put Javascript in one line.

    After this it adds jQuery but it need few lines more to use $

    First: it needs some time to load jQuery so it needs time.sleep()

    Second: this code doesn't create automatically $ and it needs $ = window.jQuery;

    from selenium import webdriver
    import time
    
    url = 'https://stackoverflow.com/questions/57941221/how-can-i-use-jquery-with-selenium-execute-script-method'
    driver = webdriver.Firefox()
    driver.get(url)
    
    driver.execute_script("""var jquery_script = document.createElement('script'); 
    jquery_script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
    document.getElementsByTagName('head')[0].appendChild(jquery_script);""")
    
    time.sleep(0.5) # time to load jQuery library
    driver.execute_script('$ = window.jQuery;')
    
    driver.execute_script('$("h1").wrap("<i></i>")')
    #driver.execute_script('$ = window.jQuery;$("h1").wrap("<i></i>")')
    

    You can also use jquery_script.onload in first script to run code which will create $

    jquery_script.onload = function(){var $ = window.jQuery;};
    

    but it still need time.sleep() before you use $.

    I took this from Load jQuery with Javascript and use jQuery

    from selenium import webdriver
    import time
    
    url = 'https://stackoverflow.com/questions/57941221/how-can-i-use-jquery-with-selenium-execute-script-method'
    driver = webdriver.Firefox()
    driver.get(url)
    
    driver.execute_script("""var jquery_script = document.createElement('script'); 
    jquery_script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
    jquery_script.onload = function(){var $ = window.jQuery;};
    document.getElementsByTagName('head')[0].appendChild(jquery_script);""")
    
    time.sleep(0.5) # time to load jQuery library
    
    driver.execute_script('$("h1").wrap("<i></i>")')
    

    Eventually you can run all in onload and then you don't need time.sleep()

    jquery_script.onload = function(){var $ = window.jQuery; $("h1").wrap("<i></i>");};
    

    Full code

    from selenium import webdriver
    import time
    
    url = 'https://stackoverflow.com/questions/57941221/how-can-i-use-jquery-with-selenium-execute-script-method'
    driver = webdriver.Firefox()
    driver.get(url)
    
    driver.execute_script("""var jquery_script = document.createElement('script'); 
    jquery_script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
    // jquery_script.onload = function(){var $ = window.jQuery; $("h1").wrap("<i></i>");};
    jquery_script.onload = function(){
      var $ = window.jQuery; 
      $("h1").wrap("<i></i>");
    };
    document.getElementsByTagName('head')[0].appendChild(jquery_script);""")
    
    0 讨论(0)
  • 2020-12-22 07:03

    It seems way better to load a local jquery:

    with open('jquery.js', errors='ignore') as f:
      driver.execute_script(f.read())
    
    title = driver.execute_script('return $("title").text()')
    

    It's faster and you don't have to worry about timing issues.

    0 讨论(0)
提交回复
热议问题