Selenium-chrome driver.get () в цикле разрывается после пары повторений - PullRequest
1 голос
/ 08 мая 2019

Я хочу удалить данные с веб-страницы, которая постоянно меняется (новые сообщения каждые пару секунд). Я вызываю driver.get () в цикле while, но после нескольких повторений я не получаю новых результатов. Он постоянно возвращает один и тот же пост снова и снова. Я уверен, что страница меняется (проверено в браузере)

Я пытался использовать time.wait () и driver.refresh (), но проблема сохраняется

    chrome_options = Options()
    chrome_options.add_argument("--headless")
    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=self.cp.getSeleniumDriverPath())

    while True:
        driver.get(url)
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        posts = soup.find_all(some class)

        (...)
        some logic with the result
        (...)

        driver.refresh() #tried interchangably with driver.get() from the beginning of loop

Насколько я знаю, driver.get () должен дождаться загрузки страницы перед выполнением следующей строки кода. Может быть, я сделал что-то не так по языку (я довольно плохо знаком с Python). Должен ли я сбросить некоторые атрибуты драйвера при каждом запуске цикла? Я видел решения, которые используют driver.get () в таком цикле, но в моем случае это не работает. Как заставить драйвер полностью обновить страницу перед ее очисткой?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

selenium будет иметь ошибки, если страница находится в процессе загрузки, когда вы пытаетесь отправить команды в окно. Вам следует внедрить time.sleep() или какой-то метод ожидания, специфичный для селена , чтобы убедиться, что страница готова к обработке. Что-то вроде

import time

    while True:
        driver.get(url)
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        posts = soup.find_all(some class)

        (...)
        some logic with the result
        (...)

        driver.refresh()
        time.sleep(5) # probably too long, but I usually try to stay on the safe side

Лучший вариант, вероятно, будет использовать что-то вроде

element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )

по ссылке выше, которую я разместил, это позволит убедиться, что элемент находится там, не заставляя ждать 5 секунд. Если нужный элемент находится там через 0,0001 секунды, ваш сценарий продолжится после этого времени. Это позволяет сделать тайм-аут произвольно большим (скажем, 120 секунд), не влияя на скорость выполнения.

0 голосов
/ 08 мая 2019

Я предполагаю, что ваш веб-драйвер Chrome кэширует .Попробуйте добавить это: driver.manage().deleteAllCookies(), прежде чем получить страницу.

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