Ответ 1
Вы можете проверить, что прокрутка сделала что-либо на каждом шагу.
lastHeight = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(pause)
newHeight = driver.execute_script("return document.body.scrollHeight")
if newHeight == lastHeight:
break
lastHeight = newHeight
Это использует статическую сумму ожидания, которая является плохим, потому что вы не хотите ждать лишнего, когда она заканчивается быстрее, и вы не хотите, чтобы script выходил раньше, когда динамическая нагрузка слишком медленно по какой-то причине.
Так как на странице обычно загружается еще несколько элементов в список, вы можете проверить длину списка перед загрузкой и дождаться загрузки следующего элемента.
В твиттере это может выглядеть так:
while True:
elemsCount = browser.execute_script("return document.querySelectorAll('.stream-items > li.stream-item').length")
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
try:
WebDriverWait(browser, 20).until(
lambda x: x.find_element_by_xpath(
"//*[contains(@class,'stream-items')]/li[contains(@class,'stream-item')]["+str(elemsCount+1)+"]"))
except:
break
Я использовал выражение XPath, потому что у PhantomJS 1.x иногда возникает ошибка при использовании селекторов :nth-child()
CSS.
Полная версия для справки.