Проблема с StaleElementReferenceException ошибка иногда выскакивает - PullRequest
0 голосов
/ 18 октября 2019

Привет, у меня есть этот код, который генерирует меня:

selenium.common.exceptions.StaleElementReferenceException: Сообщение: ссылка на устаревший элемент: элемент не прикреплен к документу страницы

Что может быть причиной этого? Этот код работает нормально в 10 случаях, но в 11 нет. Есть ли шанс улучшить его, чтобы предотвратить такие ошибки?

Строки, которые генерируют сбои:

compare_announcement_text(context, option_name, element_offer_type)

И:

if element_offer_type.text == option_name:
def select_announcement(context, option_name):
    """Select announcement from 'Offer Type' drop down
            :param context:
            :param option_name:
            :return: Announcement page
        """
    offer_type = context.driver.find_element_by_xpath(Locators.offer_type)
    offer_type.click()
    offer_type_list = context.driver.find_elements_by_xpath(Locators.all_elements_buttons_offer_type)
    offer_type_text = []
    for element_offer_type in offer_type_list:
        compare_announcement_text(context, option_name, element_offer_type)
        offer_type_text.append(element_offer_type.text)
    if option_name not in offer_type_text:
        time.sleep(0.5)  # menu not fully rendered - need to wait
        offer_type_list = context.driver.find_elements_by_xpath(Locators.all_elements_buttons_offer_type)
        for element_offer_type in offer_type_list:
            compare_announcement_text(context, option_name, element_offer_type)
    from features.pages.announcement_page import AnnouncementPage
    return AnnouncementPage(context)


def compare_announcement_text(context, option_name, element_offer_type):
    if element_offer_type.text == option_name:
        WebDriverWait(context.driver, 20).until(
            expected_conditions.visibility_of_all_elements_located(
                (By.XPATH, Locators.all_elements_buttons_offer_type)))
        for check in range(4):
            try:
                ActionChains(context.driver).move_to_element(element_offer_type).click(element_offer_type).perform()
                return
            except selenium.common.exceptions.ElementClickInterceptedException:
                time.sleep(0.5)
        else:
            print(f"Tried click {option_name} for 2 seconds - making final click")
            ActionChains(context.driver).move_to_element(element_offer_type).click(element_offer_type).perform()
    else:
        print(f'Element selected in offer type is not {option_name} and is {element_offer_type.text}')


Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Эта проблема легко вызывается, если вы используете find_elements_by_xpath, чтобы сначала получить набор элементов.

Я предлагаю вам снова найти элемент в цикле for следующим образом:

offer_type_list = context.driver.find_elements_by_xpath(Locators.all_elements_buttons_offer_type) 
offer_type_text = []
for i in range(1, len(offer_type_list)+1):
    # xpath example: (//div[@class='abc'])[1]
    element_offer_type = context.driver.find_element_by_xpath("("+Locators.all_elements_buttons_offer_type+")["+str(i)+"]")
    compare_announcement_text(context, option_name, element_offer_type)
    offer_type_text.append(element_offer_type.text)
1 голос
/ 18 октября 2019

@ Jonx -> Это не единственная причина. Вопрос также о приложении, который использует @ranger. Если он динамический (с перезагрузкой элементов, например, вызывает новые живые данные), это также поднимает эту проблему. в зависимости от времени поступления данных (например, после получения ссылки на элемент, но до выполнения действия). Это может быть болью в заднице -, -

@ Yun - как эта идея, но также (если в тестировании), используя шаблон объекта страницы, хорошая идея - использовать представления, а затем выполнять действия в рамках попытки. кроме блоков, или фактически определяя элементы Page как методы свойств, так что вы получите чистый код, а WebDriver будет искать элемент при каждом вызове. Это облегчает проблему.

Да, я знаю, что это не очень «высокопроизводительное» решение, но - как всегда - компромиссы для стабильного поведения с живыми динамическими приложениями.

1 голос
/ 18 октября 2019

Я столкнулся с тем же исключением некоторое время назад. Это вызвано тем, что элемент, с которым вы взаимодействуете, не загружен в DOM в этот момент. Вы можете решить эту проблему с помощью webDriverWait, ожидающего отображения элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...