Как я могу использовать 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);""")