Python, Selenium и Chromedriver - бесконечный цикл с использованием find_element_by_id вызывает проблемы с процессором - PullRequest
0 голосов
/ 07 декабря 2018

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

Мой сценарий: Мне нужно отслеживать цены из 6 разных таблиц на одной странице, которая меняется почти каждую секунду.К концу дня я бы закрыл браузер (нажав кнопку X) и завершил сценарий (нажав Control + C), а затем снова запустил его утром и позволил ему работать весь день.Сценарий написан на python и использует селен для чтения цен.Я использую браузер Chrome.Моя ОС - Windows 2008 R2;Версия Selenium - 3.14.1

, здесь есть частичная часть кода.Он просто читает цены в таблицах, используя find_elements_by_id внутри бесконечного цикла с интервалом в 1 секунду.

While True:
    close1 = float(browser.find_element_by_id('bnaBox1').find_elements_by_id('lastprc1')[0].text.encode('ascii','ignore'))
    close2 = float(browser.find_element_by_id('bnaBox2').find_elements_by_id('lastprc2')[0].text.encode('ascii','ignore'))
    close3 = float(browser.find_element_by_id('bnaBox3').find_elements_by_id('lastprc3')[0].text.encode('ascii','ignore'))
    close4 = float(browser.find_element_by_id('bnaBox4').find_elements_by_id('lastprc4')[0].text.encode('ascii','ignore'))
    close5 = float(browser.find_element_by_id('bnaBox5').find_elements_by_id('lastprc5')[0].text.encode('ascii','ignore'))
    close6 = float(browser.find_element_by_id('bnaBox6').find_elements_by_id('lastprc6')[0].text.encode('ascii','ignore'))
    time.sleep(1)
...

В течение первых нескольких минут выполнения скрипты потребляют минимальное количествопроцессора (около 20 ~ 30 процентов), но через несколько минут потребление постепенно увеличивается до 100%!На компьютере не выполняются никакие другие процессы, кроме сценария.

Устранение неполадок, которые я проделал до сих пор (все они не решили мою проблему)

  • обновил мой chrome до последней версии - v71 и chromerdriver 2.44
  • откатил Chrome до предыдущих версий (v62, v68, v69, v70)
  • откатил версию Chromedriver до 2.42 и 2.43
  • очистил мои файлы% TEMP% -
  • перезагрузил компьютер (несколько раз)

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

Надеясь, что кто-нибудь может помочь мне выяснить, что вызывает эту проблему в процессоре, и решить проблему.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Было бы трудно угадать точную причину 100% использования ЦП без какой-либо видимости ваших блоков кода, в частности конфигурации WebDriver .Таким образом, ответ будет в значительной степени основан на общих рекомендациях следующим образом:

  • Никогда закрыть браузер (нажав кнопку X) .Всегда вызывайте driver.quit() в методе tearDown(){}, чтобы изящно закрыть и уничтожить экземпляры WebDriver и Web Client .
  • Никогда прервать выполнение сценария (нажав Control + C) .В случае наличия зомби WebDriver или Web Browser экземпляров вы можете программно удалить их.
  • Несколько полезных ChromeOptions() и их использование заключаются в следующем:

    options.addArguments("start-maximized"); // open Browser in maximized mode
    options.addArguments("disable-infobars"); // disabling infobars
    options.addArguments("--disable-extensions"); // disabling extensions
    options.addArguments("--disable-gpu"); // applicable to windows os only
    options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
    options.addArguments("--no-sandbox"); // Bypass OS security model
    
  • Использование жестко закодированных снов в виде time.sleep(1) является большим Нет .

  • Incase, который вы используете Chrome в режиме без головы , было много дискуссий о непредсказуемых процессорах и потреблении памяти при сеансах Chrome Headless .
  • Всегда обновляйте Test Environment с последними выпущенными двоичными файлами:
    • Обновление ChromeDriver до текущего ChromeDriver v2.44 level.
    • Keep Chrome версия между Chrome v69-71 уровнями.( согласно примечаниям к выпуску ChromeDriver v2.44 )
    • Очистить ваше Рабочее пространство проекта через IDE и Перестройте ваш проект только с необходимыми зависимостями.
    • Если ваша базовая Веб-клиент версия устарела, удалите ее через Revo Uninstaller и установите последнюю версию GA и выпущенную версию веб-клиента .
    • Выполните перезагрузку системы .
    • Выполните @Test.
  • С Управление пространством и памятью ракурс:
0 голосов
/ 07 декабря 2018

Вы пытались освободить память в цикле?Может быть, выбрав значения (список из цикла?) И затем сбросив эти переменные на None, вы можете избежать чрезмерного потребления памяти.

...
while True:

...
    close1 = close2 = close3 = close4 = close5 = close6 = None

...

Вы также можете попробовать принудительно запустить сборщик мусора:

import gc

while True: 
...
    gc.collect()

Если вы считаете, что причиной может быть сценарий, другое решение для обнаружения проблемы может заключаться в том, чтобы включить Chrome для удаленной отладки и отладки страницы.

--remote-debugging-port=9222

Надеюсь, вам это поможет.

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