Доброго времени суток. У меня имеется скрипт который заполняет на сайте определенные поля, сайт откровенно говоря громоздкий и веб драйверу требуется заполнить более 400 позиций.
Сам скрипт выглядит примерно так:
def company_1():
...
Поиск, присвоения переменных для заполнения:
...
==========================
input('Press ENTER to start')
==========================
def insert(path,value,value_name=None):
try:
elem = driver.find_element_by_xpath(path)
elem.clear()
pyperclip.copy(str(value))
elem.send_keys(Keys.CONTROL+'V')
except:
if value_name != None: not_found_list.append(value_name)
def select(path,value,value_name=None):
try: driver.find_element_by_xpath(path).select_by_visible_text(value)
except:
if value_name != None: not_found_list.append(value_name)
insert('//*[@id="ui-view"]/div/div[3]/div/div[2]/div/div[1]/div/div/div[2]/bpo-comp-property[2]/div/ul/li[3]/input', S1_street, 'S1_street')
select('//*[@id="ui-view"]/div/div[3]/div/div[2]/div/div[1]/div/div/div[2]/bpo-comp-property[2]/div/ul/li[14]/select', Zoning)
Когда использовал код без функций-инструкций, он выполнялся чуть быстрее, но в обслуживании и написании получался громоздким.
Как понимаю, скорость выполнения в большей степени зависит от размера сайта и времени которое тратит веб драйвер на поиск поля, но возможно ли этот процесс как-то ускорить ?
Если задача этого шага - не проверять ввод текста, а заполнение полей для дальнейшей работы с этой формой, то смотрите в стороне executescritp - и выполняйте на стороне браузера один большой толстый скрипт, который все поля заполнит.
Скорость зависит от числа элементов, над которым надо выполнить действие. 400 элементов в одном тесте - это слишком много. Явно требуется пересмотреть подход к проектированию тестов.
А можно чуть более конкретной информации как выглядит строка этого скрипта ?
Сколько пытался найти инфу вообще по теме “execute_script” для питона, толкового ничего не находил
Может заполнять надо и все, но обязательно ли это делать в один подход ? Возможно, стоит разделить функционал по отдельным тестам. Конечно, это существенно, не ускорит процесс, если запускать в один поток, но решит проблему через запуск тестов параллельно
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(‘document.title’)
Возможно, будут сложности с составлением самих скриптов javascript.
Но тут надо, быть в теме.
Причина задержки в том что sendKeys иммитирует нажатие клавишь и для более корректной работы ставит паузы между нажатиями. setAttribute просто установит текст в нужный сразу. Скорость выполнения должна быть раза в 4 выше, если тексты были короткими. Если длинными, то даже более быстрым
Но вы можете определять тип елемента в функции инсерт и в зависимости от этого править нужный параметр. Все-равно это будет быстрее чем иммитация клавишь
От имитации клавиш я избавился путем модуля pyperclip, имитируя вставку с буфера обмена, но это решение не сильно элегантное. Буду пробовать и тестировать через установку атрибута.
Задача состоит в том, чтобы проверить заполнение полей или это просто вбивалка данных? Если 2-й случай - используйте фабрики или прямой SQL, чтобы заполнить необходимыми данными БД. Это будет на 1…2 порядка быстрее как минимум.