Как заставить Selenium не ждать полной загрузки страницы, у которой медленный скрипт?

Селен driver.get (url) дождитесь полной загрузки страницы. Но на очищающей странице попробуйте загрузить неработающий JS-скрипт. Так что мой скрипт на Python его ждет и не работает несколько минут. Эта проблема может быть на всех страницах сайта.

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.cortinadecor.com/productos/17/estores-enrollables-screen/estores-screen-corti-3000')
# It try load: https://www.cetelem.es/eCommerceCalculadora/resources/js/eCalculadoraCetelemCombo.js 
driver.find_element_by_name('ANCHO').send_keys("100")

Как ограничить время ожидания, заблокировать AJAX загрузку файла или есть другой способ?

Также я тестирую свой скрипт в webdriver.Chrome(), но будет использовать PhantomJS() или, возможно, Firefox(). Итак, если какой-то метод использует изменение настроек браузера, то он должен быть универсальным.

4 ответа

Решение

Когда Selenium загружает страницу / URL по умолчанию, он следует конфигурации по умолчанию с pageLoadStrategy установлен в normal, Чтобы Selenium не ждал полной загрузки страницы, мы можем настроить pageLoadStrategy, pageLoadStrategy поддерживает 3 различных значения следующим образом:

  1. normal (полная загрузка страницы)
  2. eager (Интерактивный)
  3. none

Вот блок кода для настройки pageLoadStrategy:

  • Firefox:

    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    caps = DesiredCapabilities().FIREFOX
    caps["pageLoadStrategy"] = "normal"  #  complete
    #caps["pageLoadStrategy"] = "eager"  #  interactive
    #caps["pageLoadStrategy"] = "none"
    driver = webdriver.Firefox(desired_capabilities=caps, executable_path=r'C:\path\to\geckodriver.exe')
    driver.get("http://google.com")
    
  • Хром:

    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    caps = DesiredCapabilities().CHROME
    caps["pageLoadStrategy"] = "normal"  #  complete
    #caps["pageLoadStrategy"] = "eager"  #  interactive
    #caps["pageLoadStrategy"] = "none"
    driver = webdriver.Chrome(desired_capabilities=caps, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("http://google.com")
    

Примечание: pageLoadStrategy ценности normal, eager а также none является обязательным требованием в соответствии с черновиком WebDriver W3C Editor, но pageLoadStrategy значение как eager по-прежнему WIP (работа в процессе) в реализации ChromeDriver. Подробное обсуждение вы можете найти в обходе стратегии загрузки страницы "Стремление" для Chromedriver Selenium в Python.

Судя по документации Selenium V4.0, теперь это выглядит так:

      from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
driver.get("http://www.google.com")
driver.quit()

Selenium Webdriver предоставляет два типа ожидания - неявное и явное. Явное ожидание заставляет WebDriver ожидать появления определенного условия, прежде чем продолжить выполнение.

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

Это ждет до 10 секунд, прежде чем бросить TimeoutException если он не найдет элемент для возврата в течение 10 секунд.

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

Ответ @undetected Selenium работает хорошо, но для хрома часть его не работает, используйте приведенный ниже ответ для хрома

      from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
browser= webdriver.Chrome(desired_capabilities=capa,executable_path='PATH',options=options)

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