Как QTP ждет, пока страница загрузит динамические данные?

У меня есть сценарий, когда статус браузера = выполнено, но страница все еще не загружена. Существует ли обычная процедура, при которой qtp может дождаться полной загрузки страницы? Я пробовал с objBrowzer.sync,objPage.Sync,objPage.waitproperty «readyState», «completed», 50. Но это работает не всегда.

Я не могу даже использовать оператор ожидания, чтобы он ждал появления этого объекта, потому что в разных случаях присутствуют разные объекты. Есть ли какое-то общее утверждение, которое будет работать во всех сценариях?

Заранее спасибо.


person user90    schedule 28.08.2014    source источник
comment
Когда вы говорите о динамических данных, вы просто спрашиваете о синхронизации вызовов AJAX? Если да, укажите, какая версия QTP/UFT используется, и я могу добавить решение позже.   -  person Xiaofu    schedule 28.08.2014


Ответы (6)


Вы только что обнаружили, что QTP не предлагает какой-либо явной поддержки синхронизации с асинхронным выполнением сценария браузера, как на веб-сайтах, управляемых AJAX. Когда QTP считает, что страница полностью загружена, на самом деле обработчики JavaScript все еще работают, возможно, обновляя HTML-код, используемый для страницы, и QTP рано обращается к графическому интерфейсу.

readyState — хорошая идея, но обычно легко найти случаи, когда это не работает достаточно хорошо.

<сильный>1. Лучшее решение – синхронизировать индикатор занятости приложения, например индикатор выполнения или индикатор активности.

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

<сильный>2. Если в приложении нет ничего подобного, часто вы можете помочь себе, синхронизируясь по какому-нибудь индикатору «готовности», например, «появилось ожидаемое поле» или «кнопка ОК исчезла». Это часто требует конкретного решения для каждого контекста, если нет реального индикатора «готовности» (которого обычно не существует).

<сильный>3. Во многих проектах специалисты по автоматизации могут получить индикатор занятости, встроенный в приложение специально для них. Хотя это не требует больших усилий для разработчиков (поскольку современные приложения имеют центральный диспетчер сообщений, поэтому переход для " busy" в состояние "idle" и vv можно легко отслеживать централизованно), это значительно упрощает объем работы, необходимой для синхронизации.

Поэтому, если возможно, попытайтесь связаться с разработчиками и попросить их предоставить свойство (переменную, отображаемый в память файл, семафор, что угодно), которое процедура «синхронизации» тестового робота может легко опросить. (Подсказка: чтобы иметь возможность различать два состояния «готов» даже после того, как «пропущено» состояние «занято» между ними, может быть полезно получить последовательный «счетчик состояний занятости» в дополнение к «флажку состояния занятости» , поэтому вы можете запросить это в том же случае.) Тогда все проблемы с синхронизацией являются дефектом в приложении, поскольку оно, очевидно, неправильно поддерживало сигнал готовности.

Обновление Для приложений, основанных на де-факто «стандартной» структуре, можно найти способы реализовать синхронизацию общим способом.

Например, для приложений JavaScript мне удалось создать инструментарий, который прозрачно сообщает о потоке событий в QTP, который используется там для ожидания «достаточно долго», позволяя устанавливать специальные библиотечные вызовы, подобные контрольным точкам, которые ждут определенных событий. (особенно «щелчок» и для приложений, которые выполняют круговые обходы AJAX а-ля Java Server Pages, «ajaxstop», события), которые должны быть завершены перед продолжением.

Это оказалось чрезвычайно полезным, потому что часто очень сложно заставить разработчиков реализовать какую-либо поддержку для нужд автоматизации тестирования, а синхронизации на основе графического интерфейса (исключительно через состояние/существование тестового объекта) иногда недостаточно, если приложение выполняет асинхронные запросы в фоновом режиме. Это также избавляет от необходимости изучать параметры синхронизации для каждого контекста графического интерфейса пользователя, что может занимать очень много времени и/или быть ненадежным.

person TheBlastOne    schedule 28.08.2014
comment
Спасибо за ответ. Было полезно - person user90; 02.09.2014

Боюсь, для вас нет простого ответа, как обычно, «это зависит»

Вот простой пример, скажем, вы ожидаете появления кнопки или текста на экране:

If Browser("user90site").Page("page1").WebButton("Button1").Exist(30) Then
  Browser("user90site").Page("page1").WebButton("Button1").Click
Else
  Reporter.ReportEvent micFail,"button missing", "button missing"
End If

Приведенное выше будет ожидать появления веб-элемента до 30 секунд, однако, если кнопка появится до истечения 30 секунд, она продолжит работу и нажмет кнопку, в противном случае сообщит об ошибке. Учитывая, что у вас есть несколько сценариев, вам нужно будет делать разные варианты, чтобы получить желаемый результат.

У вас есть неудачные тесты, потому что вы пытаетесь воздействовать на элементы, которых еще не существует?

person shicky    schedule 29.08.2014
comment
Но я хочу обобщить утверждение, для которого я не могу дождаться появления кнопки, например. Во всех случаях она не отображается на странице. - person user90; 01.09.2014
comment
почему нет? Замените биты в кавычках переменными, чтобы они менялись в зависимости от того, где вы находитесь в приложении? WebElement может быть намного проще в использовании, чем WebButton, учитывая обстоятельства - person shicky; 01.09.2014
comment
нет проблем, удачи, я надеюсь, что у вас все получится, как вы хотите - person shicky; 02.09.2014

Это непросто, особенно для сайтов с AJAX. Лучший способ - написать простую функцию, например

function WaitForObject(obj) WaitForObject = false Setting("DefaultTimeout") = 500 for i = 0 to 30 'or more If obj.Exist Then WaitForObject = true Exit For End If next Setting("DefaultTimeout") = 20000 ' or other value end function

И используйте это для объектов, которые загружаются в конце

person Mateusz Psujek    schedule 03.09.2014
comment
Это хорошая идея, если разработчики могут сообщить вам, какой объект создается в конце, и завершена ли к этому времени вся фоновая обработка (особенно связь с сервером). (К сожалению, обычно (или, по крайней мере: часто) все еще ожидаются внутренние обновления после создания графического интерфейса, то есть после создания последнего объекта графического интерфейса, что является основной причиной проблемы, с которой сталкивается OP. - person TheBlastOne; 11.12.2014

Вы можете попробовать для этого. Я знаю, что это очень поздний ответ, но он поможет вам более точно достичь результатов. Вы можете вызывать эту функцию много раз, если ваш браузер загружается дольше, как показано ниже:

Call AppBusyStatus(0)
if Browser("Browsername").Exist Then
   Call AppBusyStatus(0)
End If
Call AppBusyStatus(0)

Sub AppBusyStatus(intBrowserCreationTime)
    Do While Browser(CreationTime:intBrowserCreationTime).Object.Busy
       Wait 0,500
    Loop
End Sub
person harsha.cs    schedule 31.05.2016

Следите за загрузкой изображения и добавляйте в репозиторий,

Set obj = Browser().Page().Image()
wait()
While (obj.Exist)
'Do Nothing //commented
Wend

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

person Vinayaka    schedule 20.09.2016

while Browser("user90site").Page("page1").WebButton("Button1").Exist(2)=false
wait 2
wend
Browser("user90site").Page("page1").WebButton("Button1").Click

Оператор while будет находиться в цикле до тех пор, пока объект не будет идентифицирован. Использование while вместо if более точно.

person Paras Kumar    schedule 18.05.2016