如何在driver.execute_script(<HERE>)中引入自定义变量?

How to introduce custom variable(s) inside driver.execute_script(<HERE>)?

对于 Web 驱动程序,我们可以执行 JavaScript 代码,其中包含这样的自定义变量:

driver.execute_script("alert('%s')" % variable) # an example introducing variable in alert()

但是如果我需要修改变量的内容,我必须在脚本中写变量怎么办?

更具体地说,我面临以下问题:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

在此代码中,我必须在脚本中编写 document.body.scrollHeight。但我想添加一个随机因子 [0-1]document.body.scrollHeight 相乘,这样滚动似乎不会自动进行。为此,我尝试了以下方法:

import numpy as np
factor = float(np.random.uniform(0, 1))
driver.execute_script("window.scrollTo(0, %s);" % str(np.int(float(document.body.scrollHeight) * factor)))

但这不起作用。由于 document.body.scrollHeight 在外面,因此程序找不到 document。所以我想在脚本里面引入一个自定义变量factor。怎么做?

查看 selenium 文档 here

要将变量传递到您使用逗号的执行脚本中。 这位:

execute_script(script, *args)¶

Synchronously Executes JavaScript in the current window/frame.

Args: script: The JavaScript to execute. *args: Any applicable arguments for your JavaScript. Usage: driver.execute_script(‘return document.title;’)

当您访问变量时,您可以使用参数[x] 来访问(索引为 0)。 您会发现一个很好的例子,也是一个常见的例子:execute_script("arguments[0].click()" , element)。您可以看到 script,然后是 comma,然后是您要单击的 element。不过你想传多少就传多少。

关于你的问题。

有几种方法可以获取滚动高度。 您可以从 selenium 或从 js 获取正文滚动高度。

在 js 中完成(因此它符合您当前的方法)您可以在 2 个调用中完成。

BodyScrollHeight = driver.execute_script("return document.body.scrollHeight;") 

factor = float(np.random.uniform(0, 1))
driver.execute_script("window.scrollTo(0, %s);" % str(np.int(float(BodyScrollHeight) * factor)))

或者 - 使用逗号方法。

BodyScrollHeight = 100 #calculate your factor here 
driver.execute_script("window.scrollTo(0, arguments[0]);", BodyScrollHeight) 

我还没有机会 运行 这个,但如果它不起作用请告诉我,我会再看看。