Для веб-драйвера мы можем выполнить код 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
внутри скрипта. Как это сделать?
Смотрите документацию по селену здесь.
Чтобы передать переменные в скрипт выполнения, вы используете запятую. Этот бит:
execute_script(скрипт, *аргументы)¶
Синхронно выполняет JavaScript в текущее окно/кадр.
Аргументы: script: исполняемый код JavaScript. *args: любые применимые аргументы для вашего JavaScript. Использование: driver.execute_script('return document.title;')
При доступе к переменным вы затем используете arguments[x] для доступа (индексируется как 0).
Хороший пример и распространенный, который вы найдете: execute_script("arguments[0].click()" , element)
. Вы можете увидеть script
, затем comma
, а затем element
, на который хотите нажать. Но вы можете пройти столько, сколько захотите.
На вашу проблему.
Есть несколько способов получить высоту прокрутки. Вы можете получить высоту прокрутки тела из селена или из 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)
У меня не было возможности запустить это, но если это не сработает, дайте мне знать, и я посмотрю еще раз.