Подтвердить что ты не робот

Python selenium: не дожидается загрузки страницы после команды click()

Кто-нибудь знает, как ждать загрузки страницы? Я пробовал все возможные варианты, которые я нашел в Интернете, но просто не работает.

Мне нужно подождать после того, как я вызову команду click(), на веб-сервере есть некоторые внутренние скрипты, которые проверяют такие дураки (я исключаю код для импорта необходимых модулей и использования стандартных соглашений об именах):

WebDriverWait(browser, 10).until(lambda d: d.find_element_by_id(the_id))

или

browser.implicitly_wait(10) 

или

elem2=wait.until(EC.presence_of_element_located((By.ID,the_id)))

все вышеуказанные проверки не работают, в том смысле, что они возвращают True, даже если страница по-прежнему загружается. Это приводит к тому, что текст, который я читаю, является неполным, поскольку страница не полностью загружена после команды click(). Похоже, что в python команда clickAndWait недоступна (но опять же, вероятно, это не решит проблему, так как другие тесты также не работают). В идеале будет команда, которая ждет, пока не будет загружена вся веб-страница (независимо от конкретного элемента страницы).

Мне удалось решить проблему, вручную вставив time.sleep(5) в цикл, но это не оптимально, так как это может замедлить весь процесс. Если возможно, лучше подождать только строго необходимое время.

спасибо

4b9b3361

Ответ 1

В принципе, если страница генерируется JavaScript, тогда невозможно сказать, когда она "закончила" загрузку.

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

Должен быть какой-то элемент DOM, видимость которого вы можете использовать для проверки того, что страница "закончила" загрузку. Я обычно имею функции wait_for_element_visibility и wait_for_element_presence в моих тестовых случаях.

def wait_for_visibility(self, selector, timeout_seconds=10):
    retries = timeout_seconds
    while retries:
        try:
            element = self.get_via_css(selector)
            if element.is_displayed():
                return element
        except (exceptions.NoSuchElementException,
                exceptions.StaleElementReferenceException):
            if retries <= 0:
                raise
            else:
                pass

        retries = retries - 1
        time.sleep(pause_interval)
    raise exceptions.ElementNotVisibleException(
        "Element %s not visible despite waiting for %s seconds" % (
            selector, timeout_seconds)
    )

get_via_css является одной из моих собственных функций, но я надеюсь, что он достаточно ясно, что он делает.

Ответ 2

Здесь моя версия, которую я использовал:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def waitForLoad(inputXPath): 
    Wait = WebDriverWait(browser, PATIENCE_TIME)       
    Wait.until(EC.presence_of_element_located((By.XPATH, inputXPath)))

Верхняя строка функции является общим ожиданием. Второй - ожидаемые условия, когда он пытается найти элемент, который, как вы знаете, существует на странице. Вы можете изменить его, а вместо Xpath это CSS_SELECTOR, NAME, ID, CLASS и т.д. Есть много других, но вам придется искать документацию по ожидаемым условиям. Надеюсь, что это помогло, это помогло мне, когда я это понял.