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

Фотография

TestComplete не видит форму после нажатия Del


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

#1 vitaliy4us

vitaliy4us

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

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

Отправлено 04 апреля 2012 - 20:05

Строка грида может быть удалена тремя способами: при помощи кнопки меню, при помощи контекстного меню и при помощи клавиши Delete. После любого из этих действий выводится одна и та же форма, запрашивающая подтверждение на удаление. Для подтверждения необходимо нажать кнопку данной формы. Так вот, в первом и втором случаях никаких проблем не возникает, а вот при имитации нажатия клавиши Delete форма появляется, но вот TestComplete ee не видит. Выполнение теста останавливается навсегда в, якобы, ожидании данной формы. Не происходит ни сброса ожидания после истечения 10 сек., ни сообщения об ошибке. Индикатор теста просто замирает на строке с сообщением об ожидании данной формы. Пробовал Keys("[Del]"), Keys("[Del][Release]"), Keys("[Del]"), а затем Keys("[Release]") - результата никакого. Что ему нужно?
  • 0

#2 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 05 апреля 2012 - 04:37

У меня ощущение дежавю, кажется я уже видел этот вопрос месяц-два назад, может и не на этом форуме...

1. Попробуйте после нажатия Del сделать Sys.Refresh()

2. Если не сработает - скорее всего в этой ситуации открывается совсем другое окно (хотя внешне оно может выглядеть так же)

Если ничего из вышеприведенного не сработает - запишите (именно запишите, а не напишите вручную) 2 скрипта: 1й удаляет с помощью меню и закрывает открывшееся окно, 2й делает то же самое, но удаляет с помощью кнопки Del. И оба скрипта постите сюда
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#3 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 05 апреля 2012 - 08:25

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

Это deadlock: ТС ждёт реакции приложения на нажатие Del, а приложение ждёт действия с диалогом для этой реакции. Читайте Calling Methods Asynchronously.
  • 0
С уважением,
Дмитрий

#4 vitaliy4us

vitaliy4us

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

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

Отправлено 05 апреля 2012 - 20:55

У меня ощущение дежавю, кажется я уже видел этот вопрос месяц-два назад, может и не на этом форуме...

1. Попробуйте после нажатия Del сделать Sys.Refresh()

2. Если не сработает - скорее всего в этой ситуации открывается совсем другое окно (хотя внешне оно может выглядеть так же)

Если ничего из вышеприведенного не сработает - запишите (именно запишите, а не напишите вручную) 2 скрипта: 1й удаляет с помощью меню и закрывает открывшееся окно, 2й делает то же самое, но удаляет с помощью кнопки Del. И оба скрипта постите сюда


Записанные скрипты:
1. Удаление с помощью кнопочного меню:
function Test1()
{
  var  GWTalk;
  var  contactList;
  GWTalk = Aliases.GWTalk;
  contactList = GWTalk.Main.contactList.contactList;
  contactList.dgvMain.ClickCell(49, 1);
  contactList.pnlToolStrip.tsbRemoveContact.Click(11, 13);
  GWTalk.MessageBoxEx.ztlpMain.ztlpControl.bOK.ClickButton();
}

2. Удаление с помощью клавиши Delete:
function Test2()
{
  var  GWTalk;
  var  dataGridViewEx;
  GWTalk = Aliases.GWTalk;
  dataGridViewEx = GWTalk.Main.contactList.contactList.dgvMain;
  dataGridViewEx.ClickCell(49, 1);
  dataGridViewEx.Keys("[Del]");
  GWTalk.MessageBoxEx.ztlpMain.ztlpControl.bOK.ClickButton();
}

Так работает и из моего скрипта. Но я пользуюсь полными именами объектов. И получаю имя кнопки из Object browser в таком виде: var btn = Sys.Process("GWTalk").WinFormsObject("MessageBoxEx").WinFormsObject("_tlpMain").WinFormsObject("_tlpControl").WinFormsObject("_bOK");
И в этом случае btn.ClickButton() уже не проходит. И форма, и тест продолжают висеть. Т.е. для работы скрипта нужно вместо такого кода:
var btn = Sys.Process("GWTalk").WinFormsObject("MessageBoxEx").WinFormsObject("_tlpMain").WinFormsObject("_tlpControl").WinFormsObject("_bOK");
btn.ClickButton();
писать такой:
var  GWTalk;
GWTalk = Aliases.GWTalk;
GWTalk.MessageBoxEx.ztlpMain.ztlpControl.bOK.ClickButton();
и так все работает. Но почему то, что работает с мапированными именами, не работает с полными?
  • 0

#5 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 апреля 2012 - 05:18

А пробовали по совету Дмитрия выше использовать асинхронный вызов (в данном случае надо асинхронно нажать Del)?
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#6 vitaliy4us

vitaliy4us

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

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

Отправлено 06 апреля 2012 - 05:43

А пробовали по совету Дмитрия выше использовать асинхронный вызов (в данном случае надо асинхронно нажать Del)?

Насколько я понял, это должно выгядеть так: Runner.CallObjectMethodAsync(grid, "Keys", "[Del]")?
  • 0

#7 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 апреля 2012 - 15:43

Насколько я понял, это должно выгядеть так: Runner.CallObjectMethodAsync(grid, "Keys", "[Del]")?


Да. Но я надеюсь, вы не ждали целый день ответа и попробовали? :)
Как результаты?
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#8 vitaliy4us

vitaliy4us

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

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

Отправлено 06 апреля 2012 - 18:14


Насколько я понял, это должно выгядеть так: Runner.CallObjectMethodAsync(grid, "Keys", "[Del]")?


Да. Но я надеюсь, вы не ждали целый день ответа и попробовали? :)
Как результаты?


Выходит так, что ожидал, поскольку этим проектом могу заниматься далеко не всегда. Увы, не сработало.:(
  • 0

#9 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 06 апреля 2012 - 18:47

Я так думаю, что если вариант с краткими именами работает, то надо пользоваться им и не привередничать :)

А вот почему это происходит - тут надо подробно смотреть проект, а не видя его можно и не узнать, и не выяснить ничего.
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#10 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 07 апреля 2012 - 05:50

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

Если выполнение "зависает" и не развисает через 10 секунд (auto-wait timeout), то всё-таки очень похоже на дэдлок. Проверить можно включив подсветку точки выполнения: Tools | Options... | Engines | General | Highlight execution point. Посмотрите на какой именно строке висит выполнение и пришлите сюда эту строку.
  • 0
С уважением,
Дмитрий

#11 vitaliy4us

vitaliy4us

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

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

Отправлено 07 апреля 2012 - 06:26

Я так думаю, что если вариант с краткими именами работает, то надо пользоваться им и не привередничать :)

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


Да я, собственно говоря, так и делаю. Даже проще - посылаю Sys.Keys("[Enter]"), поскольку на форме фокус на нужной кнопке установлен по умолчанию.
  • 0

#12 vitaliy4us

vitaliy4us

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

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

Отправлено 07 апреля 2012 - 06:29

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

Если выполнение "зависает" и не развисает через 10 секунд (auto-wait timeout), то всё-таки очень похоже на дэдлок. Проверить можно включив подсветку точки выполнения: Tools | Options... | Engines | General | Highlight execution point. Посмотрите на какой именно строке висит выполнение и пришлите сюда эту строку.


Зависает, как видно из индикации выполнения теста, на поиске формы диалога подтверждения удаления (Waiting for WinFormsObject("MessageBoxEx")). Это же видно и с помощью рекомендованной Вами подсветки. Подсвечивается строка:
btn = Sys.Process("GWTalk").WinFormsObject("MessageBoxEx").WinFormsObject("_tlpMain").WinFormsObject("_tlpControl").WinFormsObject("_bOK");
  • 0

#13 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 07 апреля 2012 - 13:00

Будем исследовать дальше. Разбейте эту строку на подоперации и посмотрите, на какой именно из них будет происходить зависание.
// btn = Sys.Process("GWTalk").WinFormsObject("MessageBoxEx").WinFormsObject("_tlpMain").WinFormsObject("_tlpControl").WinFormsObject("_bOK");
var obj = Sys.Process("GWTalk");
obj = obj.WinFormsObject("MessageBoxEx");
obj = obj.WinFormsObject("_tlpMain");
obj = obj.WinFormsObject("_tlpControl");
btn = obj.WinFormsObject("_bOK");

  • 0
С уважением,
Дмитрий

#14 vitaliy4us

vitaliy4us

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

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

Отправлено 07 апреля 2012 - 20:17

Будем исследовать дальше. Разбейте эту строку на подоперации и посмотрите, на какой именно из них будет происходить зависание.

// btn = Sys.Process("GWTalk").WinFormsObject("MessageBoxEx").WinFormsObject("_tlpMain").WinFormsObject("_tlpControl").WinFormsObject("_bOK");
var obj = Sys.Process("GWTalk");
obj = obj.WinFormsObject("MessageBoxEx");
obj = obj.WinFormsObject("_tlpMain");
obj = obj.WinFormsObject("_tlpControl");
btn = obj.WinFormsObject("_bOK");


Останавливается на строчке obj = obj.WinFormsObject("MessageBoxEx"). Это объект, представляющий из себя тот самый диалог подтверждения удаления.
  • 0

#15 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 09 апреля 2012 - 06:30

На этом этапе, как мне кажется, нужно более глубокое исследование. Рекомендую обратиться в службу поддержки.
  • 0
С уважением,
Дмитрий


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

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