在Python中使用Selenium执行Javascript

1 人关注

我正在用Selenium加载一个页面,我想执行以下内容

<script>
var ep_start = $('#episode_page a.active').attr('ep_start');
var ep_end = $('#episode_page a.active').attr('ep_end');
var id = $("input#movie_id").val();
var default_ep = $("input#default_ep").val();
var alias = $("input#alias_anime").val();
loadListEpisode('#episode_page a.active',ep_start,ep_end,id,default_ep,alias);
</script>

我不知道如何用python做,我试着用完整的脚本

js = '''script'''
browser.execute_script(js)

或者只是loadListEpisode(...),将每一集替换成它的等价物,这并没有真正发挥作用。 脚本存在于页面上,所以也许有办法直接调用它。 我试着用手提取ep_start、ep_end...,然后这样做

source = BeautifulSoup(...)
var1 = source.find(...)
browser.execute_script("loadEpisodeList(var1,var2,...)")

它也不起作用,我认为它没有识别出它们是变量。

javascript
python
selenium
selenium-firefoxdriver
Ilias Oukil
Ilias Oukil
发布于 2022-01-01
2 个回答
Booboo
Booboo
发布于 2022-01-01
已采纳
0 人赞同

如果 $ 代表 jQuery ,你首先要把它加载到浏览器中,如下所示 如果它还没有被当前页面加载的话 :

path_to_jquery_js = '/my_scripts/jquery.js' # for example
with open(path_to_jquery_js, 'r') as f:
    jquery_js = r.read()
browser.execute_script(jquery_js)

如果你没有jQuery存储在本地,那么你将不得不使用类似于requests模块的东西从PyPi仓库获取它。

import requests
jquery_url = 'https://some_domain/jquery.js' # for example
r = requests.get(jquery_url)
jquery_js = r.text
browser.execute_script(jquery_js

然后你应该能够执行如下的脚本。

script = """
var ep_start = $('#episode_page a.active').attr('ep_start');
var ep_end = $('#episode_page a.active').attr('ep_end');
var id = $("input#movie_id").val();
var default_ep = $("input#default_ep").val();
var alias = $("input#alias_anime").val();
loadListEpisode('#episode_page a.active',ep_start,ep_end,id,default_ep,alias);
browser.execute_script(script)

只要确保loadListEpisode已经被其他已经加载的JavaScript所定义。

由于显而易见的原因,这一点我还没有测试过,但请试一试 -- 原则上应该是可行的。让我知道进展如何(我相信你会的)。

undetected Selenium
undetected Selenium
发布于 2022-01-01
0 人赞同

你只需将该脚本作为参数传给 execute_script() 方法如下。

driver.execute_script("""
var ep_start = $('#episode_page a.active').attr('ep_start');
var ep_end = $('#episode_page a.active').attr('ep_end');
var id = $("input#movie_id").val();
var default_ep = $("input#default_ep").val();
var alias = $("input#alias_anime").val();
loadListEpisode('#episode_page a.active',ep_start,ep_end,id,default_ep,alias);