Как заставить 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 различных значения следующим образом:
normal
(полная загрузка страницы)eager
(Интерактивный)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)