Как я могу использовать jQuery с методом Selenium execute_script?

Как я могу использовать jQuery с селеном execute_script метод, если текущая страница еще не использует jQuery?

Например:

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

Я пробовал добавить такой сценарий:

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

Но я получаю ошибки о том, что переменная jquery_script не определена.

2 ответа

Решение

Кажется, лучше загрузить локальный jquery:

with open('jquery.js', errors='ignore') as f:
  driver.execute_script(f.read())

title = driver.execute_script('return $("title").text()')

Это быстрее, и вам не нужно беспокоиться о проблемах с синхронизацией.

У вас две ошибки:

  • getElementsByTagName вместо того findElementsByTag
  • ты должен поставить это втрое """ """ или вам нужно поместить Javascript в одну строку.

После этого он добавляет jQuery но для использования нужно еще несколько строк $

Во-первых: для загрузки требуется некоторое время jQuery так что это нужно time.sleep()

Во-вторых: этот код не создается автоматически $ и это нужно $ = window.jQuery;

from selenium import webdriver
import time

url = 'https://stackru.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>")')

Вы также можете использовать jquery_script.onload в первом скрипте для запуска кода, который создаст $

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

но это все еще нужно time.sleep() перед использованием $.

Я взял это из Load jQuery with Javascript и использовал jQuery

from selenium import webdriver
import time

url = 'https://stackru.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>")')

В конце концов вы можете запустить олл-ин onload и тогда тебе не нужно time.sleep()

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

Полный код

from selenium import webdriver
import time

url = 'https://stackru.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);""")
Другие вопросы по тегам