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

ahmelevsky

Регистрация: 29 мар 2013
Offline Активность: 09 дек 2014 17:37
-----

Мои темы

Борьба со StaleElementReferenceException

04 июля 2014 - 21:06

Коллеги, посоветуйте что-нибудь хорошее :)

Дело вот какое. Браузер IE8, приложение построено на совершенно безумном фреймворке, элементы появляются и исчезают без всякого предупреждения и видимой внешней необходимости. :) Пока что мне удавалось это как-то побеждать, но сейчас как-будто в тупике. Есть у меня табличка с текстом. Мне нужно её представить в виде коллекции объектов. Каждый из объектов собирается из строки в этой таблице, ячейка строки - то или иное свойство объекта. 

Задача изначально решалась двумя циклами с использованием двух коллекций WebElement (строчки и ячейки внутри каждой строчки), т.е. традиционно. Но пока драйвер ползал внутри одной строчки, ссылка на следующую устаревала, из-за чего пришлось повторять поиск каждой отдельной ячейки по полному xpath (см. ниже метод целиком), Да, xpath получается длинноватый, но что делать, такой роскоши, как статические id в приложении не предусмотрено.



public List<Actor> getActors() {
		List<Actor> actors = new ArrayList<Actor>();
		List<WebElement> rows = driver.findElements(By.xpath("//div[contains(@onscroll,'bcgServicesLG_body') and @class='gridBody']/div[1]/table//tr"));
		 
	   int  count = rows.size();
	         
	         for (int i=1; i<=count; i++) {
	         WebElement elem =  driver.findElement(By.xpath("//div[contains(@onscroll,'bcgServicesLG_body') and @class='gridBody']/div[1]/table//tr["+i+"]"));
	         List<WebElement> props = elem.findElements(By.xpath("./td"));
	         int pcount = props.size();
	 	         
	         List<String> properties  = new ArrayList<String>();
	         for (int k=1; k<=pcount; k++) {
	           	      	 properties.add(driver.findElement(By.xpath("//div[contains(@onscroll,'bcgServicesLG_body') and @class='gridBody']/div[1]/table//tr["+i+"]/td["+k+"]")).getText().trim());
	            }
	         boolean isOn = properties.get(3).equals("включена");
	         Actor a = new Actor(properties.get(1), properties.get(2), properties.get(4), properties.get(6), isOn);
	         a.setErrorMessage(properties.get(5));
                        actors.add(a);
	         }

Да, я знаю, что вот так вот нельзя: "div[1]", но в данном случае никуда не деться. Локаторы тут оптимизации не поддаются.  

 

Я знаю, что IE не очень любит длинные xpath, но он все равно меня удивил. 

 

Вот в этом месте: 



 properties.add(driver.findElement(By.xpath("//div[contains(@onscroll,'bcgServicesLG_body') and @class='gridBody']/div[1]/table//tr["+i+"]/td["+k+"]")).getText().trim());

то на одной то на другой итерации цикла происходит то самое StaleElementReferenceException. Видать аккурат после того как элемент найден и до того, как мы успели из него текст извлечь.

Выходит, только мы элемент ухватили, идентификатор запомнили, а его уже и след простыл. 

 

Конечно, поскольку это происходит с вероятностью процентов 10-20 для каждого конкретного элемента, то можно отлавливать эксепшн и повторять поиск опять. Глядишь, потихоньку и пробьемся. Но такое решение кажется мне упадническим, и я берегу его на самый крайний случай.

 

Заранее спасибо за любые идеи.


Selenium Groovy Console

01 июля 2014 - 17:48

Здравствуйте, друзья. 
Если кто пользовался Selenium Groovy Console авторства Jan Kester (https://github.com/j...selenium-groovy), не сталкивались ли с такой проблемой при запуске:
 
запускаю через Maven стандартным путем:

mvn clean test -P firefox,development,run-console

Firefox открывается с новым профилем, некоторое время висит, потом ошибка. Консоль Groovy так и не появляется. 

[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.1.1:java (d
efault) on project selenium-groovy-public: An exception occured while executing
the Java class. null: InvocationTargetException: Failed to connect to binary Fir
efoxBinary(C:\Program Files (x86)\Mozilla Firefox\firefox.exe) on port 7055; pro
cess output follows:

Groovy 2.3.3, переменные среды прописаны, Firefox 30.0

Полный лог запуска в прикрепленном файле. 

 

Спасибо,  

 Артем


FF29 периодически "подвисает" во время тестов

23 мая 2014 - 07:07

Друзья, может быть кто-то сталкивался со такой проблемой?

 Во время работы тестов иногда (в разных местах) все как будто останавливается и может висеть часами. Если перезагрузить страницу в браузере вручную - тест как ни в чем не бывало идет дальше. 

 WebDriver 41, FireFox 29, Java 7. 

При инициализации драйвера ставил все возможные таймауты (согласно документации их три - поиск элемента, загрузка страницы, выполнение скрипта), TimeoutException не выскакивает. В момент "подвисания" в строке состояния браузера как будто продолжается загрузка страницы (то есть я бы ждал, что должен сработать pageLoadTimeout). 

Еще один момент - проблема стала проявляться после того, как в приложении появилось много модальных форм. Однако четкой закономерности в "зависаниях" установить пока не удалось.

 

Еще любопытно, почему все-таки не срабатывают таймауты, они, казалось бы, предусмотрены на все случаи.

 

Спасибо заранее. )