Как остановить тест, если страница загружается слишком долго в Selenium Python

Я тестирую веб-сайт, и у меня все хорошо, за исключением случаев, когда страница занимает слишком много времени, тогда селен продолжает поиск элемента. Я пытался использоватьdriver.set_page_load_timeout(5)но все равно продолжает загружаться вечно.
Вот код:

from selenium import webdriver
from selenium.common.exceptions import *
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import time, os,re, datetime
import logging




class SanityTest():

def login_test(self):
    driver_location = 'C:\\chromedriver.exe'
    os.environ["webdriver.chrome.driver"] = driver_location
    driver = webdriver.Chrome(driver_location)
    driver.maximize_window()
    driver.implicitly_wait(0)
    baseURL = driver.get("https://www.example.com/")
    logging.basicConfig( format = '%(asctime)s: %(levelname)s: %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p'
                        ,level=logging.INFO)
    driver.set_page_load_timeout(2)

    #Is Platform is reachable?:-
    try:
        if WebDriverWait(driver, 1).until(
                EC.visibility_of_element_located((By.XPATH, "//button[contains(@class,'button')]"))):
            logging.info("Success")
    except:
        pass

    try:
        if WebDriverWait(driver, 1).until(
                EC.visibility_of_element_located((By.XPATH, '//span[@jsselect="heading" and @jsvalues=".innerHTML:msg"]'))):

            logging.error('Failure: Unable to reach platform! ==> ' + str(driver.find_element_by_xpath('//span[@jsselect="heading" and @jsvalues=".innerHTML:msg"]').text))
            return
    except :
        print("Page is taking too long to load")
        return



 ff = SanityTest()
 ff.login_test()

1 ответ

Функционально set_page_load_timeout() работает и должно было работать на вас:

driver.set_page_load_timeout(2)

Вы можете найти подробное обсуждение в Как установить тайм-аут 'driver.get' для python selenium 3.8.0?

Однако стоит отметить, что set_page_load_timeout()применяется только после того, как 'document.readyState' равно"complete" Достигнут. Возможно, в этом случае использования'document.readyState' равно "complete" достигается довольно поздно.


Решение

В качестве решения вместо использования по умолчанию pageLoadStrategy который по умолчанию установлен на normal, вы можете установить pageLoadStrategy как eager т.е. интерактивный следующим образом:

caps["pageLoadStrategy"] = "eager"  #  interactive

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

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