Как ждать только DOM для загрузки с Selenium (без картинок) - PullRequest
2 голосов
/ 24 октября 2011

На странице длинный список изображений.В приложении есть кнопка AJAX «Загрузить больше изображений» (внизу страницы), которая активируется автоматически, когда пользователь прокручивает страницу вниз.Я хочу прокрутить страницу до самого конца с помощью Selenium и убедиться, что в нижней части страницы нет кнопки «Загрузить больше изображений».Сценарий (может быть более элегантное решение, но это не главное)

browser.execute_script("""
            setInterval(function() {
                window.scrollBy(0,50000);
            }, 1000);
           ;""")
invisibleShowMoreCounter = 0;
while True:
        if "" ==  browser.find_element_by_id("show_more").text:
            invisibleShowMoreCounter = invisibleShowMoreCounter + 1
            if (invisibleShowMoreCounter  > 3): break
        time.sleep(1)

Он прокручивает страницу до конца и затем проверяет, что в течение 3 секунд не существует элемента "show_more" (не уверен, что этоцикл нужен вообще хоть).Таким образом, дело в том, что он успешно прокручивает страницу вниз, но после этого застревает на browser.find_element_by_id («show_more») до полной загрузки страницы (включая изображения), что занимает много времени.Таким образом, DOM есть, но из-за большого количества изображений загрузка всех их занимает около нескольких минут.Я не уверен на 100%, что это происходит из-за того, что страница загружена не полностью, но она выглядит очень вероятно (поэтому она переходит к первой итерации цикла, а затем просто остается на find_element_by_id в течение нескольких минут, а затем идет дальше и успешно завершена. ВопросМожет ли команда find * метод не ждать завершения загрузки всех изображений, чтобы тест не проходил в течение нескольких минут?

Настройка browser.implicitly_wait(1) (что, похоже, имеет к этому отношение)похоже, не поможет.

1 Ответ

1 голос
/ 25 октября 2011

Вы можете подождать, пока статус браузера / документа станет интерактивным. То есть ожидание состояния js

document.readyState='interactive'
...