Я хочу очистить все данные страницы, реализованной бесконечной прокруткой. Следующий код Python работает.
for i in range(100):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
Это означает, что каждый раз, когда я прокручиваю вниз, мне нужно ждать 5 секунд, чего обычно достаточно, чтобы страница закончила загрузку вновь сгенерированного содержимого. Но это не может быть эффективным по времени. Страница может завершить загрузку нового содержимого в течение 5 секунд. Как я могу определить, заканчивает ли страница загрузку нового содержимого каждый раз, когда я прокручиваю вниз? Если я могу обнаружить это, я могу прокрутить вниз снова, чтобы увидеть больше содержимого, как только я знаю, что страница закончила загрузку. Это более эффективно по времени.
python
selenium
execute-script
apogne
источник
источник
Ответы:
webdriver
Будет ждать загрузки страницы по умолчанию с помощью.get()
метода.Поскольку вы, возможно, ищете какой-то конкретный элемент, как сказал @ user227215, вам следует использовать,
WebDriverWait
чтобы дождаться элемента, расположенного на вашей странице:Я использовал его для проверки оповещений. Вы можете использовать любые другие методы типа, чтобы найти локатор.
РЕДАКТИРОВАТЬ 1:
Следует отметить, что
webdriver
по умолчанию будет ждать загрузки страницы. Он не ожидает загрузки внутри фреймов или запросов ajax. Это означает, что при использовании.get('url')
ваш браузер будет ждать, пока страница полностью не загрузится, а затем перейдет к следующей команде в коде. Но когда вы публикуете запрос ajax,webdriver
не ждите, и вы несете ответственность за ожидание загрузки страницы или части страницы в течение соответствующего времени; так что есть модуль с именемexpected_conditions
.источник
browser.find_element_by_id('IdOfMyElement')
заставляетNoSuchElementException
быть поднятым. Документация говорит передать кортеж , который выглядит следующим образом :(By.ID, 'IdOfMyElement')
. Смотрите мой ответclick()
), прочитать текст и т. Д. У меня было ошибочное впечатление, что это просто вызвал ожидание, после которого вам все равно пришлось найти элемент. Если вы выполняете ожидание, то после поиска элемента, селен выдает ошибку, потому что он пытается найти элемент, пока старое ожидание еще обрабатывается (надеюсь, это имеет смысл). Суть в том, что вам не нужно искать элемент после использования WebDriverWait - это уже объект.Попытка передать
find_element_by_id
конструктору forpresence_of_element_located
(как показано в принятом ответе ) вызвалоNoSuchElementException
возведение. Я должен был использовать синтаксис fragles ' комментарий :Это соответствует примеру в документации . Вот ссылка на документацию для By .
источник
EC.presence_of_element_located((By.XPATH, "//*[@title='Check All Q1']"))
By
объектом.Найдите ниже 3 метода:
readyState
Проверка страницы readyState (не надежно):
id
Сравнение новых идентификаторов страниц со старыми:
staleness_of
Используя
staleness_of
метод:Для более подробной информации, проверьте блог Гарри .
источник
self.driver.execute_script('return document.readyState;')
не надежно? Кажется, он отлично работает для моего варианта использования, который ожидает загрузки статического файла в новую вкладку (которая открывается через javascript на другой вкладке вместо .get ()).Как упоминалось в ответе Дэвида Каллена , я всегда видел рекомендации по использованию строки, подобной следующей:
Мне было трудно найти где-нибудь все возможные локаторы, которые можно использовать с
By
, поэтому я подумал, что было бы полезно предоставить список здесь. Согласно веб-скрапингу с Python Райана Митчелла:источник
Из селена / webdriver / support / wait.py
источник
Кроме того, вместо 100-кратной прокрутки вы можете проверить, нет ли больше изменений в DOM (в случае нижней части страницы, загружаемой AJAX с отложенной загрузкой)
источник
Вы пробовали
driver.implicitly_wait
. Это похоже на настройку для драйвера, поэтому вы вызываете его только один раз в сеансе, и он в основном говорит драйверу подождать определенное количество времени, пока каждая команда не может быть выполнена.Таким образом, если вы установите время ожидания 10 секунд, оно выполнит команду как можно скорее, ожидая 10 секунд, прежде чем она сдастся. Я использовал это в подобных сценариях прокрутки вниз, поэтому я не понимаю, почему это не сработает в вашем случае. Надеюсь, это полезно.
Чтобы исправить этот ответ, я должен добавить новый текст. Обязательно используйте строчную букву 'w' в
implicitly_wait
.источник
Как насчет того, чтобы поместить WebDriverWait в цикл While и перехватить исключения.
источник
Здесь я сделал это, используя довольно простую форму:
источник
Вы можете сделать это очень просто с помощью этой функции:
и когда вы хотите сделать что-то после завершения загрузки страницы, вы можете использовать:
источник