Selenium использует слишком много оперативной памяти с Firefox - PullRequest
2 голосов
/ 09 марта 2019

Я использую селен с Firefox для автоматизации некоторых задач в Instagram. Он в основном перемещается между профилями пользователей и страницами уведомлений и выполняет задачи в зависимости от того, что находит.

Он имеет один бесконечный цикл, который гарантирует, что задача продолжает выполняться. У меня есть функция sleep () каждые несколько шагов, но использование памяти продолжает расти. У меня есть что-то вроде этого в Python:

while(True):
    expected_conditions()
    ...doTask()
    driver.back()
    expected_conditions()
    ...doAnotherTask()
    driver.forward()
    expected_conditions()

Я никогда не закрываю драйвер, потому что это сильно замедлит работу программы, поскольку у нее много запросов для обработки. Можно ли как-то предотвратить увеличение использования памяти сверхурочно, не закрывая и не выходя из драйвера?

РЕДАКТИРОВАТЬ: Добавлены явные условия, но это тоже не помогло. Я использую безголовый режим Firefox.

Ответы [ 3 ]

2 голосов
/ 09 марта 2019

Создание нового профиля Firefox и использование его каждый раз при запуске тестовых примеров в Firefox в конечном итоге повысит производительность выполнения, так как без этого всегда будет создаваться новый профиль и там будет выполняться кеширование информации, и если driver.quit не получитвызывается как-то до сбоя, тогда в этом случае каждый раз, когда мы создаем новые профили с некоторой кэшированной информацией, которая будет занимать память.

// ------------ Созданиеновый профиль Firefox -------------------

1. If Firefox is open, close Firefox.
2. Press Windows +R on the keyboard. A Run dialog will open.
3. In the Run dialog box, type in firefox.exe -P
Note: You can use -P or -ProfileManager(either one should work).
4. Click OK.
5. Create a new profile and sets its location to the RAM Drive.

// ----------- Ассоциированный профиль Firefox -------------------

ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("automation_profile");
WebDriver driver = new FirefoxDriver(myprofile);

Пожалуйста, поделитесь эффективностью выполнения с сообществом, если вы планируете реализовать этот способ.

2 голосов
/ 09 марта 2019
  • Использование явных или неявных ожиданий.
  • Используйте driver.quit (), чтобы закрыть все окна браузера и завершить сеанс WebDriver, потому что если вы не используете quit () в конце программы, WebDriver сессия не будет закрыта должным образом и файлы не будут очищены не в памяти. И это может привести к ошибкам утечки памяти.
1 голос
/ 09 марта 2019

Для начала Selenium имеет очень мало контроля над количеством RAM , используемым Firefox . Как вы упомянули, Клиент браузера , то есть Mozilla , перемещается назад и вперед между профилями пользователей и страницей уведомлений на Instagram и выполняет задачи на основе того, что он находит слишком широким, как один вариант использования . Итак, первой и главной задачей было бы разбить бесконечный цикл 1016 *, относящийся к вашему сценарию использования , на меньшие тесты .


time.sleep ()

Стимулирование time.sleep() жизненно накладывает одеяло на основную проблему. Однако при использовании Selenium и WebDriver для Автоматизация с использованием time.sleep(secs) без каких-либо особых условий для достижения побеждает цель Automation и его следует избегать любой ценой. Согласно документации:

time.sleep(secs) приостанавливает выполнение текущего потока на указанное количество секунд. Аргумент может быть числом с плавающей запятой, чтобы указать более точное время сна. Фактическое время приостановки может быть меньше запрошенного, потому что любой перехваченный сигнал прервет sleep () после выполнения процедуры перехвата этого сигнала. Кроме того, время приостановки может быть больше, чем запрошено на произвольную сумму, из-за планирования других действий в системе.

Подробное обсуждение можно найти в Как перевести webdriver в python на миллисекунды


* +1057 * Анализ

Ранее были случаи, когда Firefox занимал около 80% ОЗУ.

Firefox_RAM

Однако согласно этому обсуждению некоторые пользователи считают, что чем больше памяти используется, тем лучше, потому что это означает, что у вас не тратится ОЗУ. Firefox использует оперативную память для ускорения своих процессов, поскольку данные приложений передаются в оперативную память гораздо быстрее.


Решение

Вы можете выполнить один / все общие / специальные шаги следующим образом:

  • Обновление Селен до текущих уровней Версия 3.141.59 .
  • Обновление GeckoDriver до GeckoDriver v0.24.0 уровень.
  • Обновление Firefox версии до Firefox v65.0.2 уровней.
  • Очистите ваше Рабочее пространство проекта через IDE и Перестройте ваш проект только с необходимыми зависимостями.
  • Если ваша базовая версия Web Client устарела, удалите ее и установите последнюю версию GA и выпущенную версию Web Client .
  • Некоторые расширения позволяют блокировать такой ненужный контент, например:

    • uBlock Origin позволяет скрывать рекламу на сайтах.
    • NoScript позволяет выборочно включать и отключать все скрипты, работающие на веб-сайтах.
    • Чтобы открыть клиент Firefox с расширением, вы можете загрузить расширение, например файл XPI, из https://addons.mozilla.org и использовать add_extension(extension='webdriver.xpi') метод добавления расширения в FirefoxProfile следующим образом:

      from selenium import webdriver
      
      profile = webdriver.FirefoxProfile() 
      profile.add_extension(extension='extension_name.xpi')
      driver = webdriver.Firefox(firefox_profile=profile, executable_path=r'C:\path\to\geckodriver.exe') 
      
  • Если для Тестов не требуется CSS , вы можете отключить CSS после этого обсуждения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...