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

Фотография

Ожидание завершения всех AJAX-запросов в Selenium (HOWTO)


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

#1 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 15 июля 2009 - 18:07

Всем привет!

Недавно писал тесты для AJAX-приложения. Устал от постоянных выяснений "что да куда подгружается" и понял, что мне очень не хватает в Selenium метода waitForAjaxRequests(). Собственно им и хочу поделиться.
Подробности здесь.

Сообщение отредактировал vitorg: 11 января 2011 - 14:49

  • 0

#2 astenix

astenix

    Специалист

  • Members
  • PipPipPipPipPip
  • 906 сообщений
  • ФИО:Лёша Лупан
  • Город:Кишинев


Отправлено 16 июля 2009 - 16:54

Очень хорошо!
  • 0

Software Testing Glossary - простыми словами о непростых словах.


#3 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 12 августа 2009 - 11:55

Можно пару чайниковских вопросов?

1) Как юзать метод setExtensionJs - где вызывать и что указать в качестве аргумента?
Пишу selenium.setExtensionJs("C:\\work\\SELENIUM\\user-extensions.js"); - валится

2) Как расширить драйвер? Переопределить стандартный defaultselenium скопировав туда код из вашего аттача?

Спасибо.
  • 0
Молодой пожарный не боится пламя!

#4 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 12 августа 2009 - 15:30

1. Всё есть в жабадоках (с) :)

extensionJs - a string representing the extra extension javascript to include in the browser session. This is in addition to any specified via the -userExtensions switch when starting the RC.

Т.е. в качестве параметра для setExtensionJs надо указывать сам JavaScript-код, т.е. содержимое файлика user-extensions.js, а не путь к нему.

2. Да, драйвер расширяется наследованием от DefaultSelenium и добавлением необходимых методов наследнику.
  • 0

#5 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 18 августа 2009 - 13:45

В качетсве параметра скопировала содержимое user-extension.js.
Класс переопределила, все компилится, но не работает - падает с исключением при вызове setExtesionJs.

java.lang.AbstractMethodError: com.unitedinternet.portal.selenium.utils.logging.LoggingCommandProcessor.setExtensionJs(Ljava/lang/String;)V
at com.thoughtworks.selenium.DefaultSelenium.setExtensionJs(DefaultSelenium.java:76)
at Calls.test(Calls.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at com.thoughtworks.selenium.SeleneseTestCase.runBare(SeleneseTestCase.java:212)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Хелп ми плиз...
  • 0
Молодой пожарный не боится пламя!

#6 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 18 августа 2009 - 14:02

Такое исключение валится если попытаться вызвать абстрактный метод. Можно посмотреть код?
  • 0

#7 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 18 августа 2009 - 14:18

Это я понимаю, про абстрактный метод)) Думаю что где-то путаница с наследованием... пока не разобралась.

Система такая - Custom Selenium унаследован от LoggingDefaultSelenium. Который был надыбан и приаттачен как внешний джарник к проету. В CustomSelenium добавлены ваши методы.

Есть Класс CommonData унаследованный от SeleneseTestCase.
А от CommonData наследую уже сами тесты (Calls), в которых и хочу вызвать waitForAjaxRequests.

Прикрепленные файлы

  • Прикрепленный файл  SogoOptions.zip   27,4К   26 Количество загрузок:

  • 0
Молодой пожарный не боится пламя!

#8 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 19 августа 2009 - 13:38

В приложенных исходниках подменяется CommandProcessor на LoggingCommandProcessor, в нём собственно и падает, хотелось бы посмотреть на его код, скорее всего он реализует (implements) CommandProcessor и в нём не реализован метод setExtensionJs. На реализацию можно посмотреть в HttpCommandProcessor и сделать по аналогии, если этот LoggingCommandProcessor вообще нужен, я лично логирование делал в самом CustomSelenium, там как-то проще.

А вообще странная немного архитектура, но может я чего не понял, смотрел бегло.
  • 0

#9 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 20 августа 2009 - 09:02

Спасибо за ответ.
LoggingCommandProcessor удобная штука, он позволяет отчет ы виде html-ки генерить.
Подскажите пожалуйста, где разжиться реализацией HttpCommandProcessor? Как я понимаю мне надо сделать новый класс-наследник от CommandLoggingprocessor чтобы в нем был метод setExtentionJs, который надо скопировать оттуда.

Нахожу только описание интерфейсов(
  • 0
Молодой пожарный не боится пламя!

#10 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 20 августа 2009 - 09:08

Спасибо за ответ.
LoggingCommandProcessor удобная штука, он позволяет отчет ы виде html-ки генерить.

Да, только в этих логах будет далеко не всё, хотя вполне возможно, что кому-то этого хватает.

Подскажите пожалуйста, где разжиться реализацией HttpCommandProcessor? Как я понимаю мне надо сделать новый класс-наследник от CommandLoggingprocessor чтобы в нем был метод setExtentionJs, который надо скопировать оттуда.

Нахожу только описание интерфейсов(

HttpCommandProcessor есть в исходниках Selenium RC.
  • 0

#11 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 20 августа 2009 - 09:37

За что мне нраится селен, так это за то что один раз влезешь, а потом и не вылезти.))


Итак, что я сделала.

Я нашла исходник LoggingCommandProcessor, методом копипаста сотворила из него CustomLoggingCommandProcessor с добавленым методом setExtensionJs. То есть просто через @override.
Потом заменила конструктор в CustomSelenium и все прочее.

Тест отваливается в функции waitForAjaxRequests на строке "throw new SeleniumException(message, e);"
с ошибкой unknownCommand "waitforajaxrequests"
  • 0
Молодой пожарный не боится пламя!

#12 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 20 августа 2009 - 09:46

Я нашла исходник LoggingCommandProcessor, методом копипаста сотворила из него CustomLoggingCommandProcessor с добавленым методом setExtensionJs. То есть просто через @override.

Этого недостаточно, надо потом ещё этот extensionJs передавать при вызове RC'шной команды getNewBrowserSession, или это само собой было сделано?
Я бы для начала на чистом Selenium'е всё сделал и проверил, а потом уже прикручивал различные библиотеки, т.к. далеко не все из них написаны лояльно к чужому коду.
  • 0

#13 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 20 августа 2009 - 11:50

Хорошая идея.
Попробуем с нуля.

Есть элементарный тест, унаследованный от SeleneseTestCase. Вроде бы все делаю как Вы пишете. Но не компилится, не видит метода waitForAjaxRequests.

public class OptionsTest extends SeleneseTestCase {
	   @Before
		public void setUp() {

			selenium = new CustomSelenium("localhost", 4444, "*chrome C:\\Program Files\\Mozilla Firefox_3\\firefox.exe","http://genesis1.etnasoft.com/gen_otp_test");
			selenium.setExtensionJs(
			   		"Selenium.prototype.isJqueryUsed = function() {return typeof(this.browserbot.getUserWindow().jQuery) == 'function';};"+
			   		"Selenium.prototype.isPrototypeUsed = function() {return typeof(this.browserbot.getUserWindow().Ajax) == 'function';};"+
			   		"Selenium.prototype.isDojoUsed = function() {return typeof(this.browserbot.getUserWindow().dojo) == 'function';};"+
			   		"Selenium.prototype.doWaitForAjaxRequests = function(timeout) {"+
			   			"if (this.isJqueryUsed()) {"+
			   				"return this.doWaitForJqueryAjaxRequests(timeout);"+
			   		   "}"+
			   			"if (this.isPrototypeUsed()) {"+
			   				"return this.doWaitForPrototypeAjaxRequests(timeout);"+
			   		   " }"+
			   			"if (this.isDojoUsed()) {"+
			   				"return this.doWaitForDojoAjaxRequests(timeout);"+
			   			"}"+
			   		"};"+
			   	
			   		"Selenium.prototype.doWaitForJqueryAjaxRequests = function(timeout) {"+
			   			"return Selenium.decorateFunctionWithTimeout(function() {"+
			   				"return selenium.browserbot.getUserWindow().jQuery.active == 0;"+
			   			"}, timeout);"+
			   		"};"+
			   	
			   		"Selenium.prototype.doWaitForPrototypeAjaxRequests = function(timeout) {"+
			   			"return Selenium.decorateFunctionWithTimeout(function() {"+
			   				"return selenium.browserbot.getUserWindow().Ajax.activeRequestCount == 0;"+
			   			"}, timeout);"+
			   		"};"+
			   		
			   		"Selenium.prototype.doWaitForDojoAjaxRequests = function(timeout) {"+
			   			"return Selenium.decorateFunctionWithTimeout(function() {"+
			   				"return selenium.browserbot.getUserWindow().dojo.io.XMLHTTPTransport.inFlight.length == 0;"+
			   			"}, timeout);"+
			   		"};"
		);
			
			selenium.start();
		}
	   
	   @After
		public void tearDown() {
			 selenium.stop();
	   }
 
	   @Test(expected=com.thoughtworks.selenium.Wait.WaitTimedOutException.class)
	   public void test() throws InterruptedException, ParseException {
		  
		   selenium.setContext("test()");

		 
			selenium.open("http://genesis1.etnasoft.com/gen_otp_test");
			selenium.waitForAjaxRequests(20000);
			selenium.waitForPageToLoad("3000");
	
}

  • 0
Молодой пожарный не боится пламя!

#14 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 20 августа 2009 - 12:12

Хорошая идея.
Попробуем с нуля.
Есть элементарный тест, унаследованный от SeleneseTestCase. Вроде бы все делаю как Вы пишете. Но не компилится, не видит метода waitForAjaxRequests.

Если не видит, значит там его нет, либо смотрит не туда :) Сегодня вечерком постараюсь накатать примерчик с использованием Selenium#setExtensionJs.
  • 0

#15 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 20 августа 2009 - 12:28

Примерчик было бы здорово! Пожалуйста разместите его или ссылку на ваш блог на форуме.
Правда, заценить смогу уже после отпуска...
  • 0
Молодой пожарный не боится пламя!

#16 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 07 сентября 2009 - 12:35

Можно ли посмотреть обещанный примерчик?
  • 0
Молодой пожарный не боится пламя!

#17 alex7kir

alex7kir

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

  • Members
  • PipPip
  • 75 сообщений
  • ФИО:Алексей


Отправлено 16 декабря 2009 - 12:18

Аналогичная проблема:

com.thoughtworks.selenium.SeleniumException: Waiting for all active AJAX requests to finish during 60000 milliseconds... ERROR: Unknown command: 'waitForAjaxRequests'

Куда копать? :)
  • 0

#18 barancev

barancev

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

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


Отправлено 16 декабря 2009 - 12:52

Аналогичная проблема:

com.thoughtworks.selenium.SeleniumException: Waiting for all active AJAX requests to finish during 60000 milliseconds... ERROR: Unknown command: 'waitForAjaxRequests'

Куда копать? :)

Сервер надо запускать вот так:

java -jar selenium-server.jar -userExtensions user-extensions.js

(соответствующий файл user-extensions.js см. выше)
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#19 alex7kir

alex7kir

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

  • Members
  • PipPip
  • 75 сообщений
  • ФИО:Алексей


Отправлено 16 декабря 2009 - 13:01

Аналогичная проблема:

com.thoughtworks.selenium.SeleniumException: Waiting for all active AJAX requests to finish during 60000 milliseconds... ERROR: Unknown command: 'waitForAjaxRequests'

Куда копать? :)

Сервер надо запускать вот так:

java -jar selenium-server.jar -userExtensions user-extensions.js

(соответствующий файл user-extensions.js см. выше)


Спасибо, уже сам догадался. :)
Но я использую Eclipse + Maven + Selenium, и оказалось, что я забыл в настройках selenium-maven-plugin прописать
<userExtensions>путь к файлу</userExtensions>
  • 0

#20 Denis_S

Denis_S

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

  • Members
  • Pip
  • 1 сообщений
  • ФИО:Скляров Денис Алекснадрович

Отправлено 21 декабря 2010 - 15:11

Всем привет!

Недавно писал тесты для AJAX-приложения. Устал от постоянных выяснений "что да куда подгружается" и понял, что мне очень не хватает в Selenium метода waitForAjaxRequests().
Собственно им и хочу поделиться:

Подключаем user-extensions.js
Расширяем драйвер

Подробности здесь.


Здравствуйте.

Недавно лазил я по сайту и обнаружил эту тему.

С сожалением обнаружил что фалйы c исходниками загрузить не представляется возможным.

Очень прошу выложить их снова так как тема интересная.

Спасибо, Денис.

P.S.

Если возможно с коментариями какие методы откуда вызываются.
  • 0


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

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