Я работаю над набором тестов, используя веб-драйвер selenium (написанный на Python). Тестируемая страница содержит форму, которая изменяет отображаемые поля в зависимости от того, какое значение выбрано в одном из полей выбора. Это поле выбора содержит около 250 опций. У меня есть тест (запускаемый через нос, хотя это, вероятно, не имеет значения), который перебирает все параметры в поле выбора, проверяя, что в форме отображаются правильные поля для каждого выбранного параметра.
Проблема в том, что для каждого варианта вызывается через селен:
- нажмите, чтобы выбрать вариант
- find_element и is_displayed для 7 полей
- find_elements для элементов в поле выбора
- get_attribute и текст для каждой опции в поле выбора
Таким образом, получается (примерно) 250 * (7 * 2 + 1 + 2 * 250) или 128 750 различных запросов к серверу веб-драйвера, на котором выполняется тест, и все это в течение примерно 10 или 15 минут. В некоторых случаях это приводит к исчерпанию клиентского порта на машине, на которой выполняется тест. Все это выполняется через тестовую среду, которая абстрагируется от таких вещей, как анализ поля выбора, создание новых объектов страницы и некоторые другие вещи, поэтому оптимизация в тестовом коде означает либо хакнуть все это к черту, либо выбросить framework для этого теста и делать все вручную (что с точки зрения ремонтопригодности нашего тестового кода — плохая идея).
Некоторые идеи, которые у меня были для решений:
- Попытка каким-то образом объединить или повторно использовать соединение с сервером веб-драйвера.
- Как-то подправить конфигурацию
urllib2
илиhttplib
во время выполнения, чтобы соединения открывались по тайм-ауту селена или быстрее убивались - Независимый от системы (или, по крайней мере, реализуемый для всех систем с переключателем ОС или чем-то подобным) механизм активного отслеживания и закрытия портов, открываемых селеном.
Как я уже упоминал выше, я не могу много сделать, чтобы настроить способ анализа или обработки страницы, но у меня есть контроль над созданием подклассов/настройкой WebDriver
или RemoteConnection
любым удобным для меня способом. Есть ли у кого-нибудь какие-либо предложения о том, как подойти к любой из вышеперечисленных идей, или какие-либо идеи, которые я не придумал?