Вопрос:
Я был на прогулке, ища способ получить доступ к невидимому текстовому полю, используя selenium webdriver. Единственный способ, которым я получил его, – это использовать
driver.execute_script(«document.getElementById(‘text_field’).value+=’XYZ'»)
Однако, вместо использования XYZ, я хочу использовать переменные python.
Ответ №1
Обычный способ передачи переменных в код JavaScript, выполняемый через Selenium, – это просто передать переменные в execute_script:
foo = «something» driver.execute_script(«»» var foo = arguments[0]; document.getElementById(‘text_field’).value += foo; «»», foo)
Вы извлекаете аргумент на стороне JavaScript через объект arguments. Вы можете сделать это, потому что код, который вы передаете на execute_script, завернут в функцию, так что что-то вроде:
function () { var foo = arguments[0]; document.getElementById(‘text_field’).value += foo; }
и функция вызывается с аргументами, которые были переданы в execute_script. Аргументы сериализуются автоматически Selenium.
Интерполяция с помощью .format или конкатенации строк – это хрупкие способы сделать это. Например, если вы выполните ‘var foo = «‘ + foo + ‘»‘, это сломается, как только ваша переменная foo будет иметь двойную кавычку (то же самое с ‘var foo = «{0}»‘.format(foo)). Использование json.dumps будет избегать этого и будет работать в большинстве случаев, но оно не заботится о чем-то вроде этого:
el = driver.find_element(«.something») // Do stuff with el on the Python side. driver.execute_script(«»» var el = arguments[0]; // Do something with el on the JavaScript side. «»»)
Selenium знает, как преобразовать объект Python, который он дает вам, когда вы находите объект для объекта DOM со стороны JavaScript. json.dumps не делает этого.
Ответ №2
Вам нужно получить строковое представление JavaScript вашего значения переменной Python и вставить его в вашу команду JavaScript. К счастью, модуль Python json сделает это за вас.
from json import dumps driver.execute_script(«document.getElementById(‘text_field’).value+=» + dumps(my_python_variable))
Я бы опасался просто вставить значение в кавычки, как показали другие ответы. Что делать, если в значении уже есть метки кавычек или специальные символы, которые нужно экранировать? Что, если это не строка? json.dumps будет обрабатывать все необходимые форматирования и экранирования для вас, соответствующие типу вашей переменной.
Ответ №3
Если я ничего не делаю, один из вариантов:
driver.execute_script(«document.getElementById(‘text_field’).value+='{0}'».format(foo)) Ответ №4
Если я правильно понимаю проблему, вы пытаетесь передать var вместо жестко закодированного XYZ
driver.execute_script(«document.getElementById(‘text_field’).value+='» + var + «‘»);