Selenium скачать весь HTML

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

Мне нужно загрузить всю страницу (если какой-то контент не загружается из-за отложенной загрузки из-за отсутствия прокрутки, это нормально). Я попытался установить задержку time.sleep(), но это не сработало. После того, как я получил страницу, я хочу ее хешировать и сохранить в БД для последующего сравнения и проверки, изменился ли контент. В настоящее время хэш каждый раз отличается, и это потому, что селен не загружает всю страницу, каждый раз, когда отсутствует другая частичная сумма. Я подтвердил это на нескольких веб-страницах, а не только на единственном.

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

Сколько времени занимает этот процесс, не важно. Если это займет 1+ часа, так и быть, скорость важна не только точность.

Если у вас есть альтернативная идея, пожалуйста, поделитесь.

Моя декларация водителя

 from selenium import webdriver
 from selenium.common.exceptions import WebDriverException

 driverPath = '/usr/lib/chromium-browser/chromedriver'

 def create_web_driver():
     options = webdriver.ChromeOptions()
     options.add_argument('headless')

     # set the window size
     options.add_argument('window-size=1200x600')

     # try to initalize the driver
     try:
         driver = webdriver.Chrome(executable_path=driverPath, chrome_options=options)
     except WebDriverException:
         print("failed to start driver at path: " + driverPath)

     return driver

Мой URL-адрес называется мой тайм-аут = 20

 driver.get(url)
 time.sleep(timeout)
 content = driver.page_source

 content = content.encode('utf-8')
 hashed_content = hashlib.sha512(content).hexdigest()

^ здесь каждый раз получается новый хеш, так как один и тот же URL не создает одну и ту же веб-страницу

2 ответа

Решение

Поскольку тестируемое приложение (AUT) основано на Angular, React, Vue, в этом случае Selenium кажется идеальным выбором.

Теперь, как вы в порядке с тем, что some content isn't loaded from lazy loading because of not scrolling делает возможный случай использования. Но всеми возможными способами ...do not have time to find an element on them to make sure it is loaded... не может быть действительно компенсированным побуждением time.sleep() как time.sleep() имеют определенные недостатки. Вы можете найти подробное обсуждение в разделе Как перевести webdriver в Python на миллисекунды. Стоит отметить, что состояние HTML DOM будет разным для всех 1000 нечетных веб-страниц.

Решение

Пара жизнеспособных решений:

Если вы реализуете pageLoadStrategy, page_source Метод будет запущен в той же точке отключения, и, возможно, вы увидите идентичный hashed_content.

По моему опыту time.sleep() плохо работает с динамическим временем загрузки. Если страница содержит большое количество javascript, вы должны использовать предложение WebDriverWait.

Что-то вроде этого:

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

driver = webdriver.Chrome()
driver.get(url)

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "[my-attribute='my-value']")))

Измените 10 с любым таймером, который вы хотите, и By.CSS_SELECTOR и его значение с любым типом, который вы хотите использовать в качестве ссылки для lo

Вы также можете обернуть WebDriverWait вокруг оператора Try/Except с помощью TimeoutException исключение, которое вы можете получить из субмодуля selenium.common.exceptions в случае, если вы хотите установить жесткий лимит.

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

Другие вопросы по тегам