Lord Elrond
Lord Elrond

Reputation: 16062

How can I use jQuery with selenium execute_script method?

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

For example:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get(url)
driver.execute_script('$("#id").wrap("<h1></h1>")')

I've tried adding a script like this:

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.findElementsByTag('head')[0].appendChild(jquery_script)"
)

But I get errors saying that the jquery_script variable is undefined.

Upvotes: 0

Views: 5288

Answers (2)

pguardiario
pguardiario

Reputation: 55002

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.

Upvotes: 8

furas
furas

Reputation: 143097

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);""")

Upvotes: 2

Related Questions