Selenium (python) явная ошибка тайм-аута ожидания

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

Всякий раз, когда я пытаюсь сделать следующее:

def next5():
    try:
        myElem5 = WebDriverWait(driver, 600).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#fmdsetup > table > tbody > tr:nth-child(2) > td > input[type="radio"]')))
        next5 = driver.find_element_by_class_name('nav_entry')
        next5.click()
    except TimeoutException:
    print("Timed out waiting for page to load (next5)")

Я получаю оператор печати TimeoutException. Я пытался увеличить время ожидания, но оно всегда истекает. Странно то, что он отбрасывает исключение TimeoutException до того, как прошло 10 минут.

Кроме того, скрипт отлично работает, если я просто использую функцию сна:

def next5():
    time.sleep(600)
    next5 = driver.find_element_by_class_name('nav_entry')
    next5.click()

Как я уже говорил, у меня есть несколько экземпляров next<#>() функций, которые отлично работают и отличаются только временем ожидания. Чем отличается эта ситуация и как я могу заставить ее работать?


person evanderford    schedule 09.07.2018    source источник


Ответы (1)


С:

def next5():
    try:
        myElem5 = WebDriverWait(driver, 600).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#fmdsetup > table > tbody > tr:nth-child(2) > td > input[type="radio"]')))
        next5 = driver.find_element_by_class_name('nav_entry')
        next5.click()
    except TimeoutException:
    print("Timed out waiting for page to load (next5)")

а также

def next5():
    time.sleep(600)
    next5 = driver.find_element_by_class_name('nav_entry')
    next5.click()

разные и первый не работает а второй работает, могу сказать что проблема с myElem5 элементом. Он вообще не кликабельный, поэтому нет смысла добавлять время ожидания, либо этого элемента нет в DOM. Что именно в вашем случае, я не могу сказать. Старайтесь точно смотреть, находится ли элемент в DOM и на него кликабельно. Попробуйте сделать то же самое вручную, а затем отладьте. Я думаю, вы найдете проблему.

РЕДАКТИРОВАТЬ: согласно вашим отзывам, вы делаете это так:

def next5(counter=1):
    try:
        if counter == 5:
            WebDriverWait(driver, 10).until(EC.url_contains(("the new url, where elem 5 exists")))
        myElem5 = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, '#fmdsetup > table > tbody > tr:nth-child(2) > td > input[type="radio"]')))
        next5 = driver.find_element_by_class_name('nav_entry')
        next5.click()
        counter += 1
    except TimeoutException:
        print("Timed out waiting for page to load (next5)")

PS убедитесь, что этого элемента нет в iframe/frame, если да, то сначала его нужно включить и только потом этот элемент будет готов с ним взаимодействовать. Вы можете использовать этот подход:

WebDriverWait(driver, 600).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//xpath/to/frame")))
# do your stuff
driver.switch_to.default_content()
person Andrei Suvorkov    schedule 09.07.2018
comment
Хорошо, теперь, когда вы упомянули об этом, DOM может быть проблемой. Эта загрузка страницы отличается от остальных, потому что она идет страница -> пустой экран -> страница (с которой работает next5). Как заставить скрипт игнорировать пустую страницу и работать только с нужной страницей? - person evanderford; 09.07.2018
comment
URL тоже меняется? - person Andrei Suvorkov; 09.07.2018
comment
Да, адрес меняется. Исходный код пустой страницы: <!-- -->. - person evanderford; 10.07.2018
comment
Затем URL-адрес остается прежним для следующей страницы с несколькими <!-- --> вверху (которые накапливаются по мере продвижения процесса на пустой странице). Таким образом, URL-адрес пустой страницы совпадает с URL-адресом страницы, с которой я хочу, чтобы next5() взаимодействовал. - person evanderford; 10.07.2018
comment
Хммм... Я воспользовался вашим предложением, но скрипт по-прежнему возвращает ошибку тайм-аута. Я также пытался увеличить время ожидания без изменений. - person evanderford; 10.07.2018
comment
Чем я думаю, это тот случай, когда вам нужно использовать time.sleep(), когда счетчик = 5. Если вы удовлетворены моей помощью, пожалуйста, отметьте мой ответ, нажав на серую кнопку с галочкой под кнопкой отрицательного ответа. - person Andrei Suvorkov; 10.07.2018