javascript 在Selenium execute_script中传递JS变量[Python]

pieyvz9o  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(174)

我很抱歉从字面上垃圾邮件 selenium 线程。

driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", element)

这是我用来在动态生成的列表(Instagram粉丝)上向下滚动的代码。这是一个有限的列表,所以滚动越低,滚动就越小,因为在顶部列表中只有12个元素,而在底部它由所有的关注者组成。我的问题是我有一些数据丢失:当我扫描2个账户406,分别280追随者,刮刀返回只有392和264用户名.我检查了页面的HTML酱料,看看丢失是否是由于数据生成/抓取/数据处理。看起来“完全”生成的HTML列表分别有392个和264个元素。因此,元素加载到页面上的方式存在问题。我不知道是什么原因导致了这些损失,我想是互联网的打嗝加上大块的滚动(每次滚动之前和之后大约有2-3秒的停顿,所以加载时间不是问题)。返回到

driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", element)

我想把卷轴做得更精细一点。随着滚动条越来越小,滚动条保持不变的大小,我不能预设像素数量。显然,如果使用固定的因子来乘以scrollheight,比如1/2或3/4 bcs,滚动不会到达列表的末尾。在我看来,我需要一个动态因子,它随着滚动循环的每次迭代而增加,类似于

for i in range(max_followers):
  q=i/max_followers
  driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight*q", element)

因此每个滚动将向下移动~1个元素/迭代。但是当我运行这样的代码时,我会得到一个错误:

selenium.common.exceptions.JavascriptException: Message: javascript error: q is not defined

我想这是可以理解的,我还没有在js中定义变量。有没有办法在execute_script中定义q,并将python中生成的值(i,max_followers)传递给jscript?

sg3maiej

sg3maiej1#

可以向execute_script传递多个参数。

driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight * arguments[1]", element, q)
jv4diomz

jv4diomz2#

您可以在将字符串传递给Javascript之前对其进行格式化。在Python3中实现这一点的标准方法是f-strings,它使用{}来引用变量。

for i in range(max_followers):
  q=i/max_followers
  driver.execute_script(f"arguments[0].scrollTop = arguments[0].scrollHeight*{q}", element)

这就是用计算出的q替换q。你可以在这里阅读更多关于f-string语法的内容:https://realpython.com/python-f-strings/

相关问题