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

Фотография

WebDriver. Как узнать завершение выполнения js кода

WebDriver javascript

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

#1 alexandr_vv

alexandr_vv

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

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

Отправлено 12 апреля 2014 - 07:39

Подскажите, пожалуйста, каким образом можно узнать, выполняется ли сейчас js-код на странице WebDriver'а?

Проблема в том, что после загрузки страницы идут ajax-запросы и выполняются еще какие-то действия на стороне клиента. С ожиданием ajax'ов я вроде разобрался:

 

private void WaitForAjaxComplete(FirefoxDriver driver)
        {
            bool isComplete;
            do
            {
                Thread.Sleep(100);
                isComplete = (bool)  driver.ExecuteScript("return Ext.Ajax.isLoading() == false;");
            } while (!isComplete);
        }
 
Для jQuery можно проверять "return jQuery.active == 0;"
 
Можно ли либо средствами того же javascript, либо средствами webDriver'а узнать, выполняется ли еще какой-нибудь js-код?

  • 0

#2 neman

neman

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

  • Members
  • PipPip
  • 142 сообщений
  • ФИО:Антон


Отправлено 12 апреля 2014 - 09:25

Рискну предположить, что это вам не нужно. Ожидайте не завершения js кода, а появления результатов его отработки. 


  • 0

#3 uga

uga

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

  • Banned
  • Pip
  • 18 сообщений
  • ФИО:uga

Отправлено 12 апреля 2014 - 21:49

Можно ли либо средствами того же javascript, либо средствами webDriver'а узнать, выполняется ли еще какой-нибудь js-код?

 

1. alexandr_vv, говори яснее, что интересует, а то neman подвергает себя непонятному риску!

2.1 Что есть "ещё какой-нибудь код" - ты в тестовых сценариях мутишь с js-инъекциями?

2.2.1 или речь идёт об активности штатного js, тогда уточни контекст своей проблемы?

2.2.2 если вопрос тупа теоретический, тогда ответ оптимистически-позитивный.


 

 


#4 neman

neman

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

  • Members
  • PipPip
  • 142 сообщений
  • ФИО:Антон


Отправлено 13 апреля 2014 - 09:23

Пресвятая толстота, с одной ветки ссаными тряпками прогнали, решил к другим поцепляться? Пожалуй оставлю вас, где uga появляется, сразу начинается срач и переход на личности.


  • 0

#5 alexandr_vv

alexandr_vv

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

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

Отправлено 13 апреля 2014 - 10:02

 

 

2.1 Что есть "ещё какой-нибудь код" - ты в тестовых сценариях мутишь с js-инъекциями?

 

Например, после того, как страничка загрузилась, выполнились все ajax-запросы, идет обработка этих запросов:

var result = Ext.decode(response.responseText);

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

// установить значения полей формы...

 

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

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


  • 0

#6 uga

uga

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

  • Banned
  • Pip
  • 18 сообщений
  • ФИО:uga

Отправлено 13 апреля 2014 - 17:45

neman, спасибо (отряд не заметил потери бойца).

 

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

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

 

alexandr_vv, правильно ли я понял твою мысль/проблему:

1. дожидаться/парсить динамический/непредсказуемый респонз, затем, по завершению работы скриптов, анализировать соответствие ему обработанных/отрендеренных dom, css, инфо... у текущей страницы. Т.е. не сравнивать априорно ожидаемый результат на странице с полученным, а апостериорно анализировать адекватность того, что по ходу пьесы приходит по протоколу - тому, что затем рождается/живёт своей жизнью/работает на странице (в рамках ожидаемого контекста)?

ИЛИ

2.  дожидаться/парсить только ожидаемый респонз, а что на странице будет в результате, например,  не доступно/сложно для анализа посредством webDriver?


 

 


#7 alexandr_vv

alexandr_vv

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

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

Отправлено 14 апреля 2014 - 04:55

neman, спасибо (отряд не заметил потери бойца).

 

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

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

 

alexandr_vv, правильно ли я понял твою мысль/проблему:

1. дожидаться/парсить динамический/непредсказуемый респонз, затем, по завершению работы скриптов, анализировать соответствие ему обработанных/отрендеренных dom, css, инфо... у текущей страницы. Т.е. не сравнивать априорно ожидаемый результат на странице с полученным, а апостериорно анализировать адекватность того, что по ходу пьесы приходит по протоколу - тому, что затем рождается/живёт своей жизнью/работает на странице (в рамках ожидаемого контекста)?

ИЛИ

2.  дожидаться/парсить только ожидаемый респонз, а что на странице будет в результате, например,  не доступно/сложно для анализа посредством webDriver?

 

Скорее второе. По сути, все предсказуемо. Я могу навешать кучу условий ожидания, пока все кнопочки не появятся, пока грид не заполнится, пока таб не откроется...

Но это только для одной странички. Для другой придется писать примерно то же самое и примерно столько же.

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


  • 0

#8 FibYar

FibYar

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

  • Members
  • Pip
  • 57 сообщений
  • ФИО:Большаков Виталий

Отправлено 14 апреля 2014 - 07:10

Как вариант (достаточно плохой вариант, но действенный, если известно, сколько вообще приемлемо ждать), можно выполнять проверку вида:

1) после окончания загрузки тех элементов, загрузки которых можно явно дождаться, убедиться, что всё на форме соответствует ожидаемому;

2) если проверки выдали ложный результат, то подождать максимально приемлемое время для ожидания отработки js-скриптов (скажем, пару секунд - пользователь не будет рад, если после полной, как ему кажется, загрузки страницы у него будут кнопки пропадать/появляться);

3) проверить еще раз форму. Если и в этот раз есть ошибки, то уже выдавать их.


  • 0

#9 uga

uga

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

  • Banned
  • Pip
  • 18 сообщений
  • ФИО:uga

Отправлено 14 апреля 2014 - 22:08

Скорее второе. По сути, все предсказуемо. Я могу навешать кучу условий ожидания, пока все кнопочки не появятся, пока грид не заполнится, пока таб не откроется...

Но это только для одной странички. Для другой придется писать примерно то же самое и примерно столько же.

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

Я кажется начинаю понимать: ты хочешь типа, иметь возможность создавать определенное кастомное событие, (задав ему в соответствие обработчик, пинающий на исполнение соответствующий блок selenium-кейса), и генерировать это событие в конце исполнения, например конкретной jscript-функции, в результате работы которой будет подготовлен контент, необходимый для соответствующей проверки.
alexandr_vv, ты молодец - ты мыслишь... мне самому (если правильно понимаю) интересно то, что тебе нужно...

 

 


#10 barancev

barancev

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

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


Отправлено 15 апреля 2014 - 09:03

neman, спасибо (отряд не заметил потери бойца).

Отряд заметил.
Модераториал: режим чтения на неделю за личные выпады.
  • 1
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#11 barancev

barancev

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

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


Отправлено 15 апреля 2014 - 09:12

По существу вопроса: Универсального способа определить "момент завершения выполнения JavaScript-кода" не существует.


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

#12 BigHooter

BigHooter

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

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

Отправлено 02 июня 2014 - 19:27

Ладно давайте не универсальный. 

Есть какой то JS скрипт, который сделан с нормальным API.

И нам нужно определить что он выполнил все преобразования на странице.

 

Для определенности у меня есть визуализация главы книги с использованием MathJax org

В его настройках есть такой обработчик события

MathJax.Hub.Queue(function () {Message("*** MathJax is done ***")}); 

И вот теперь как мне прикрутить эту конструкцию к Selenium.

По идее должно быть просто, но пока знания у меня в зачаточном состоянии.

 

Как понимаю, нужно запустить эту конструкцию в браузере, чтоб MathJax ее подхватил (я пытаюсь отпрофилировать уже готовые страницы на сервере). И потом какой то флаг считывать в Selenium.

 

Помогите, плиз...


  • 0

#13 BigHooter

BigHooter

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

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

Отправлено 24 июня 2014 - 12:50

C MathJax оказалось все просто. У него нашелся массивчик в котором он публикует события window.MathJax.Hub.signal.posted, и просто дождался когда он опубликует.

 

Постарому:

selenium.waitForCondition("(typeof window.MathJax === 'undefined') || (window.MathJax.Hub.signal.posted[window.MathJax.Hub.signal.posted.length-1][0]=='End Process')", "240000");

По новому:

driver.manage().timeouts().implicitlyWait(300, TimeUnit.SECONDS);
waitForLoad(driver, "return (typeof MathJax === 'undefined') || (MathJax.Hub.signal.posted[window.MathJax.Hub.signal.posted.length-1][0]=='End Process')");

  • 0



Темы с аналогичным тегами WebDriver, javascript

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

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