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) в цикл, но это не оптимально, так как это может замедлить весь процесс. Если возможно, лучше подождать только строго необходимое время.
спасибо
Ответы
Ответ 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 и т.д. Есть много других, но вам придется искать документацию по ожидаемым условиям. Надеюсь, что это помогло, это помогло мне, когда я это понял.