【问题标题】:How can I use jQuery with selenium execute_script method?如何将 jQuery 与 selenium execute_script 方法一起使用?
【发布时间】:2020-01-16 08:50:35
【问题描述】:

如果当前页面尚未使用 jQuery,我如何通过 selenium 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 变量未定义。

【问题讨论】:

  • 你可以使用javascript插入&lt;script src="http//.../path/to/jquery.js"&gt;&lt;/script&gt;来加载jQuery
  • @furas 谢谢,但我已经尝试过了,但无法让它工作。我添加了一个显示我尝试的更新。
  • 你有两个错误:getElementsByTagName 而不是findElementsByTag,你必须把它放在三个""" """ 或者你必须把Javascript放在一行中。然后它运行正常,但仍然没有创建您可以在下一个脚本中使用的$。使用链接中的代码(在标记为已接受的答案中)我可以使用 $ 运行我的代码

标签: javascript python jquery selenium


【解决方案1】:

加载本地 jquery 似乎更好:

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

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

速度更快,您不必担心时间问题。

【讨论】:

  • 我不确定,我认为缩小版中有一些奇怪的 unicode。
  • 我可以从这里的某个地方下载文件以 jquery.js 的形式在本地存储:jquery.com/download 吗? +
  • @Qharr,是的,我使用了最新的压缩生产版本,但没关系。
  • 确保在执行 driver.get(url) 后执行此操作
【解决方案2】:

你有两个错误:

  • getElementsByTagName 而不是 findElementsByTag
  • 你必须把它放在三重""" """ 或者你必须把Javascript放在一行中。

在此之后它添加了jQuery,但它需要多几行才能使用$

首先:它需要一些时间来加载jQuery 所以它需要time.sleep()

第二:此代码不会自动创建$,它需要$ = 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>")')

您也可以在第一个脚本中使用jquery_script.onload 来运行将创建$ 的代码

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

但在使用 $ 之前仍然需要 time.sleep()

我是从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>")')

最终你可以在onload 中运行所有代码,然后你就不需要time.sleep()

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

完整代码

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

【讨论】:

  • 谢谢!我把 document.getElementById 和 selenium find_element_by_id 方法混在一起了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多