Перейти к содержимому

Тестирование REST API
онлайн, начало 17 июня
Chrome DevTools: Инструменты тестировщика
онлайн, начало 20 июня
SQL для тестировщиков
онлайн, начало 24 июня
Git: инструменты тестировщика
онлайн, начало 20 июня
Фотография

Обход StaleElementReferenceError: el is not attached в js

js StaleElementReferenceError JavaScript node.js

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 SDSLeon

SDSLeon

    Новый участник

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Вечеренко Сергей Вячеславович
  • Город:Киев

Отправлено 21 Январь 2014 - 20:04

Пишу на node.js + mocha

 

Пока писал тесты для only client side приложений проблем не возникало.

Когда выпал шанс попрактиковатся на ClientSide + ServerSide, начали появлятся проблемы.

Все решил, кроме этой Uncaught StaleElementReferenceError: stale element reference: element is not attached to the page document.

 

Нагуглил про try...catch, но к сожалению, ошибка не перехватывается.

    try {
        driver.findElement({ css: '#vendor_partners_gridtable tr:nth-child(2) .colName_name' }).getText();
    } catch (StaleElementReferenceError) {
        console.log("no element")
    }

  • 0

#2 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 821 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 23 Январь 2014 - 13:19

Если "исключение не перехватывается" это либо ошибка в JavaScript (что маловероятно :)), либо ошибка в Вашем коде -- скорее всего исключение возникает не там, где Вы его пытаетесь перехватывать. Покажите полный stacktrace, может быть это добавит ясности, где оно возникает.


  • 0

Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium


#3 SDSLeon

SDSLeon

    Новый участник

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Вечеренко Сергей Вячеславович
  • Город:Киев

Отправлено 12 Февраль 2014 - 12:09

Если "исключение не перехватывается" это либо ошибка в Java (что маловероятно :)), либо ошибка в Вашем коде -- скорее всего исключение возникает не там, где Вы его пытаетесь перехватывать. Покажите полный stacktrace, может быть это добавит ясности, где оно возникает.

Потерзал наших java скриптеров и они ответили то же что и вы :) ('скорее всего исключение возникает не там, где Вы его пытаетесь перехватывать').

error нужно перехватывать в error callback -e:

driver.wait(function() {
        return driver.findElement(target).click().then(
            function(click) { return true },
            function(err)   { return false }
        );
}, 10000);

  • 0

#4 leipreachan

leipreachan

    Активный участник

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 13 Февраль 2014 - 08:07

 

Если "исключение не перехватывается" это либо ошибка в Java (что маловероятно :)), либо ошибка в Вашем коде -- скорее всего исключение возникает не там, где Вы его пытаетесь перехватывать. Покажите полный stacktrace, может быть это добавит ясности, где оно возникает.

Потерзал наших java скриптеров и они ответили то же что и вы :) ('скорее всего исключение возникает не там, где Вы его пытаетесь перехватывать').

error нужно перехватывать в error callback -e:

driver.wait(function() {
        return driver.findElement(target).click().then(
            function(click) { return true },
            function(err)   { return false }
        );
}, 10000);

В порядке эксперимента разделите получение элемента (где и вылетает это исключение) от клика по нему. Оберните в try{} catch {} именно findElement.

 

кстати, элемент у вас, случайно, не двигается во время клика?


  • 0

#5 SDSLeon

SDSLeon

    Новый участник

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Вечеренко Сергей Вячеславович
  • Город:Киев

Отправлено 13 Февраль 2014 - 16:54



В порядке эксперимента разделите получение элемента (где и вылетает это исключение) от клика по нему. Оберните в try{} catch {} именно findElement.

 

кстати, элемент у вас, случайно, не двигается во время клика?

 

 

Вылетало именно при попытке .click(), елемент передобавлялся в DOM из за чего и вылетала ошибка.

try...catch не подходит для ассинхронного кода. Ошибка приходит именно в этот error callback , function(err) где мы и обрабатываем полученную ошибку.

 

Сейчас в этом коде при любой ошибке просто возвращаеться false в wait и wait пытается еще раз попробовать найти елемент и сделать клик.

 

 

Можно написать как то так, что бы перехватывать именно нужную ошибку.

    driver.wait(function() {
        return driver.findElement(target).click().then(
            function(click) { return true },
            function(err) { 
                if (err = StaleElementReferenceError) {
                    return false;
                } else {
                    throw err;
                }
            }
        );
    }, 10000);

  • 0

#6 leipreachan

leipreachan

    Активный участник

  • Members
  • PipPip
  • 95 сообщений
  • Город:Москва

Отправлено 17 Февраль 2014 - 07:53

 

В порядке эксперимента разделите получение элемента (где и вылетает это исключение) от клика по нему. Оберните в try{} catch {} именно findElement.

 

кстати, элемент у вас, случайно, не двигается во время клика?

 

 

Вылетало именно при попытке .click(), елемент передобавлялся в DOM из за чего и вылетала ошибка.

try...catch не подходит для ассинхронного кода. Ошибка приходит именно в этот error callback , function(err) где мы и обрабатываем полученную ошибку.

 

Сейчас в этом коде при любой ошибке просто возвращаеться false в wait и wait пытается еще раз попробовать найти елемент и сделать клик.

 

 

Можно написать как то так, что бы перехватывать именно нужную ошибку.

    driver.wait(function() {
        return driver.findElement(target).click().then(
            function(click) { return true },
            function(err) { 
                if (err = StaleElementReferenceError) {
                    return false;
                } else {
                    throw err;
                }
            }
        );
    }, 10000);

 

 

ээ

для асинхронного - не подходит, но ведь findElement и click должны выполняться последовательно.   а, понял о чём вы. wait асинхронный.

 

Вы написали именно то, что я и имел в виду. Более удобного способа обходить StaleElementException я не знаю.


  • 0


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн




Темы с аналогичным тегами js, StaleElementReferenceError, JavaScript, node.js

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика
Реклама на портале