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

Фотография

Element not found in the cache


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

#1 GFSD

GFSD

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

  • Members
  • Pip
  • 3 сообщений

Отправлено 24 января 2012 - 12:25

Помогите решить проблему:
пользуюсь Page Object model, складываю все элементы на странице в списки, начинаю проделывать действия с элементами, выходит такой странный exception:
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Element not found in the cache - perhaps the page has changed since it was looked up
Неужели после обновления страницы вебэлементы теряются? И мой список элементов действует только до обновления страницы?
P.S. на странице куча AJAX'ов даже при нажатии на checkbox...
  • 0

#2 barancev

barancev

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

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


Отправлено 24 января 2012 - 18:51

Элементы на ajax-страницах меняются постоянно. Их нужно искать непосредственно перед использованием. Хранить ссылки на ранее найденные элементы бесполезно, они "протухают". Причем селениум не виноват, это кеш браузера так работает, браузер постоянно перестраивает DOM, и старые элементы удаляет.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#3 ice-cream

ice-cream

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

  • Members
  • Pip
  • 12 сообщений

Отправлено 22 мая 2012 - 07:45

идеи как с этим бороться имеются?
  • 0

#4 Wolonter

Wolonter

    Постоянный участник

  • Members
  • PipPipPip
  • 205 сообщений
  • ФИО:Макс
  • Город:Екатеринбург


Отправлено 22 мая 2012 - 09:36

идеи как с этим бороться имеются?

Мы - так:

1. Использовать там же, где нашли
tester.findElement(By.xpath("//a[@id='code221']")).click();

2. Хранить не элемент, а Xpath или код элемента
Т.е. не
WebElement element = tester.findElement(By.xpath("//a[@id='code221']"));
...
element..click();
а так:
String elementId = tester.findElement(By.xpath("//a[@id='code221']")).getAttribute("id");
...
tester.findElement(By.xpath("//a[@id='"+elementId+"']")).click();

  • 0

#5 PARTIZAN

PARTIZAN

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

  • Members
  • Pip
  • 7 сообщений
  • ФИО:Андрей

Отправлено 28 августа 2012 - 10:53

У меня похожаю ошибка, но выскакивает она как-то рандомно только в двух тестах и в основном в фаерфоксе. Локально у меня всегда проходит,а валится на серваке. Не знаю как ее отловить.
Кликаю не так как вы говорили, а сначала нахожу элемент,а потом уже кликаю. Иногда проходит иногда нет.
  • 0

#6 owasp

owasp

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

  • Members
  • PipPip
  • 87 сообщений

Отправлено 06 марта 2013 - 14:13

У меня похожаю ошибка, но выскакивает она как-то рандомно только в двух тестах и в основном в фаерфоксе. Локально у меня всегда проходит,а валится на серваке. Не знаю как ее отловить.
Кликаю не так как вы говорили, а сначала нахожу элемент,а потом уже кликаю. Иногда проходит иногда нет.

Также случается:
Для FireFox:
OpenQA.Selenium.StaleElementReferenceException : Element not found in the cache - perhaps the page has changed since it was looked up
Для Internet Explorer:
OpenQA.Selenium.StaleElementReferenceException : Element is no longer valid
Чтобы проблемные элементы оставалися актуальными, стал перед обращением к ним получать информацию о них, в частности атрибуты. Указанных выше исключений не стало.

Для этого использую метод расширения Info() для IWebElement (он так-то для получения информации об элементе, для записи в лог, но он получает атрибуты элемента, тем самым не давая браузеру викинуть элемент из кеша):
    //C# для Selenium.Webdriver.dotNet40
    public static class WebElementExtension
    {
        public static string Info(this IWebElement element)
        {
            string info = "{";
            try { info += String.Format("Type: {0}; ",          element.GetType().Name); } catch (Exception) { };
            try { info += String.Format("Tag: {0}; ",           element.TagName); } catch (Exception) { };
            try { info += String.Format("class: {0}; ",         element.GetAttribute("class")); } catch (Exception) { };
            try { info += String.Format("id: {0}; ",            element.GetAttribute("id")); } catch (Exception) { };
            try { info += String.Format("Text: {0}; ",          element.Text); } catch (Exception) { };
            try { info += String.Format("Displayed: {0}; ",     element.Displayed); } catch (Exception) { };
            try { info += String.Format("Location: {0}:{1}; ",  element.Location.X, element.Location.Y); } catch (Exception) { };
            try { info += String.Format("Size: {0}x{1}; ",      element.Size.Width, element.Size.Height); } catch (Exception) { };
            info += "}";
            return info;
        }
    }

Таким образом, если раньше некий код приводил к исключениям, связанных с кешированием, (код вида):
btnClose.Click();
То обращение к атрибутам элемента перед кликом по нему, решает проблему, инициализирцет элемент, перед кликом по нему:
btnClose.Info();
btnClose.Click();

  • 0

#7 O'Leen

O'Leen

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

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 21 марта 2013 - 11:41

        public static string Info(this IWebElement element)
        {
            string info = "{";
            try { info += String.Format("Type: {0}; ",          element.GetType().Name); } catch (Exception) { };
            try { info += String.Format("Tag: {0}; ",           element.TagName); } catch (Exception) { };
            try { info += String.Format("class: {0}; ",         element.GetAttribute("class")); } catch (Exception) { };
            try { info += String.Format("id: {0}; ",            element.GetAttribute("id")); } catch (Exception) { };
            try { info += String.Format("Text: {0}; ",          element.Text); } catch (Exception) { };
            try { info += String.Format("Displayed: {0}; ",     element.Displayed); } catch (Exception) { };
            try { info += String.Format("Location: {0}:{1}; ",  element.Location.X, element.Location.Y); } catch (Exception) { };
            try { info += String.Format("Size: {0}x{1}; ",      element.Size.Width, element.Size.Height); } catch (Exception) { };
            info += "}";
            return info;
        }
    }


А какие импорты вы используете? у меня куски типа TagName, Text catch (Exception) упорно подсвечиваются красным в эклипсе...

А вообще как-то странно, почему в одном тесте например вебдрайвер по линке 2 раза кликает, а на третий раз или "Element is not currently visible and so may not be interacted with" или "Element not found in the cache - perhaps the page has changed since it was looked up"
  • 0

#8 owasp

owasp

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

  • Members
  • PipPip
  • 87 сообщений

Отправлено 21 марта 2013 - 13:36

А какие импорты вы используете? у меня куски типа TagName, Text catch (Exception) упорно подсвечиваются красным в эклипсе...

А вообще как-то странно, почему в одном тесте например вебдрайвер по линке 2 раза кликает, а на третий раз или "Element is not currently visible and so may not be interacted with" или "Element not found in the cache - perhaps the page has changed since it was looked up"

В java соотвествующие поля есть, они с маленькой буквы пишутся. А приведённый мною код на C# (using OpenQA.Selenium.WebDriver).
Практика показала, что дёрганье элементов не особо помогает (когда память заканчивается, а браузеры её потребляют быстро, то ошибки всё равно появляются), больше помогает добавление оперативной памяти виртулке, где тесты выполняются.
  • 0

#9 O'Leen

O'Leen

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

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 22 марта 2013 - 10:28

Элементы на ajax-страницах меняются постоянно. Их нужно искать непосредственно перед использованием. Хранить ссылки на ранее найденные элементы бесполезно, они "протухают". Причем селениум не виноват, это кеш браузера так работает, браузер постоянно перестраивает DOM, и старые элементы удаляет.


а можно какой-нибудь маленький примерчик поиска элемента непосредственно перед кликом?

или может кто знает как выйти из этой ситуации с помощью javascript...
  • 0

#10 Nwd

Nwd

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

  • Members
  • Pip
  • 28 сообщений

Отправлено 19 июня 2013 - 11:09

Необходимо всего лишь переопределять элементы после обновления страницы.

Пример:

List<WebElement> videos = driver.findElements(By.xpath("//a[@class='cap']"));
driver.findElement(By.xpath("//a[@class='js-load-more normal_button list_more']")).click();
videos = driver.findElements(By.xpath("//a[@class='cap']"));

И все прекрасно работает
  • 0


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

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