WebDriverException: Сообщение: TypeError: не может получить доступ к мертвому объекту - PullRequest
0 голосов
/ 05 июля 2018

В довольно сложном тестовом скрипте python-selenium (который недоступен извне, поэтому я не могу привести пример), у меня есть следующая строка, ожидающая, пока элемент станет видимым:

WebDriverWait(basedriver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"clb-iframe-workspace")))
elem = WebDriverWait(basedriver, 20).\
           until(EC.element_to_be_clickable((By.XPATH, '//div[contains(text(), "Feature extraction")]')))

В большинстве случаев проблем нет, и веб-драйвер находит нужный элемент. Но иногда (примерно 1 из 10 случаев) я получаю следующую ошибку:

WebDriverException: Message: TypeError: can't access dead object

И странно, что это происходит прямо сейчас! Selenium даже не удосуживается подождать 20 секунд, которые я хочу, чтобы Selen подождал, используя WebDriverWait!

Может быть, переключатель iframe как-то связан с этим? Я также попытался сделать снимок экрана перед неудачной строкой - в обоих случаях я получаю пустой белый экран. Так как же отладить это дальше сам? И почему WebDriverWait не ждет ...?

Добавление

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

Так что я бы сказал, что это определенная проблема синхронизации, в сочетании с ошибкой в селене ...

1 Ответ

0 голосов
/ 05 июля 2018

Согласно рекомендациям переключение на <iframe> должно быть реализовано, вызывая WebDriverwait с Ожидаемые_условия предложение frame_to_be_available_and_switch_to_it (locator) .


класс frame_to_be_available_and_switch_to_it (объект)

class frame_to_be_available_and_switch_to_it(object) - ожидание проверки, доступен ли данный кадр для переключения. Если кадр доступен, он переключает данный драйвер на указанный кадр.


Итак, вам нужно заменить строки:

elem = WebDriverWait(basedriver, 20).\
        until(EC.presence_of_element_located((By.ID, 'clb-iframe-workspace')))
basedriver.switch_to_frame(elem)

как:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"clb-iframe-workspace")))

Примечание : Вы должны добавить следующий импорт:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...