Как обновить страницу, пока она не будет загружена должным образом (из-за ошибки сервера, такой как ошибка 502) - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь автоматизировать веб-сайт с помощью веб-драйвера Selen в Python.Он застревает, когда не получает кликабельный элемент из-за ошибки сервера, для которой страница загружена неправильно.Я хочу создать функцию, которая будет автоматически обновлять страницу через 15 секунд, если она не загружается должным образом (более конкретно, если она не получает кликабельный элемент).

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

driver=webdriver.Chrome(r"C:\Users\Hp\Downloads\chromedriver")

driver.get("https://addguru.in/user/index.php")
driver.maximize_window()

driver.implicitly_wait(15)

username=driver.find_element_by_name("username").send_keys("-------")

password=driver.find_element_by_name("password").send_keys("-------")

driver.implicitly_wait(40)

driver.find_element_by_class_name("submit_btn").click()
""" I want a function here which automatically refresh the page after each 15 sec if  the submit-btn is not clickable (due to propely loading problem) """
browser.find_element_by_id("checkCbtaskdiv").click()


driver.implicitly_wait(10)

Ответы [ 3 ]

0 голосов
/ 29 марта 2019

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

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

driver.execute_script('''

    window.errorCount = 0;
    window.onerror = function (error, url, line, column, errorMessage) {

        errorCount ++;
        //** Add whatever you like from the error information to this json string.
        errorJson = '{"code":"' + error.Status + '", "error":"' + error.Status + '", "details":"' + errorMessage + '"}';
        //Appending hidden input with details to document. All console errors can be scraped this way, or just ones that stop page load if you like.
        $("body").append("<input type='hidden' class='console-error-saved' id='" + errorCount 
     + '"' value='" + errorJson + "'");

    }
''')

Затем из ваших сценариев Selenium, ожидая появления ожидаемого элемента, если время ожидания истекло и он все еще не находит элемент, запустите:

pageErrors = driver.execute_script('''
    var json = ""; 
    var errors = $('.console-error-saved'); 
    for(var x=0; x < errors.length; x++) { 

        json += $(errors[x]).text(); 
        if(x < errors.length - 1) { 
            json += ","; 
        } 

    } 
    return "[" + json + "]";
''')

Теперь проанализируйте json из Python, чтобы получить объект из строки. Найдите конкретные ошибки, такие как 502, 503 и т. Д., И сообщите о них, а затем вызовите команду обновления

import json
errors = json.loads(pageErrors)
#... look at the errors and handle them as needed.
# If qualifying error occurred, refresh the page and do your checks again.
driver.refresh()
0 голосов
/ 29 марта 2019

Добро пожаловать в So. Вот метод.

# interval - refresh time
# maxTime - maximum time to wait (rather going into infinite loop)
def refresh_browser_until_element_present(locator_type, locator, interval, maxTime):
    startTime = datetime.now()
    elements = []
    while ((datetime.now() - startTime).seconds<maxTime and len(elements) ==0):
        time.sleep(interval)
        driver.refresh()
        if locator_type == 'xpath':
            elements = driver.find_elements_by_xpath(locator)
        elif locator_type == 'css':
            elements = driver.find_elements_by_css_selector(locator)

Как использовать метод:

refresh_browser_until_element_present('css','#checkCbtaskdiv',15,120)
0 голосов
/ 28 марта 2019

Просто смотрите быстро, и согласно этому ответу , вы можете установить ответ driver.find_element_by_class_name("submit_btn") без .click() на переменную, а затем проверить, не является ли эта переменная None

while elements is None:
    elements = driver.find_element_by_class_name("submit_btn")

for e in elements:
    e.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...