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

Фотография

QTP 9.2, использование WScript и WshShell


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

#1 Slasher

Slasher

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

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

Отправлено 27 августа 2008 - 11:52

Добрый день всем.
Есть задача эмулировать нажатие кнопок из теста. Пишу как в хэлпе:
[codebox]set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "{LEFT}"[/codebox]
тест прерывается с ошибкой:
Run Error Object required: 'WScript'
Line (35): "set WshShell = WScript.CreateObject("WScript.Shell")".

В хэлпе написано, что WScript корневой объект и всегда доступен, ничего вроде как делать не надо, но есть загадочная фраза:
If you choose an environment that supports it, be sure to reference the QuickTest type library before you begin writing or running your automation script. For example, if you are working in Microsoft Visual Basic, choose Project > References to open the References dialog box for your project. Then select QuickTest Professional <Version> Object Library (where <Version> is the current installed version of the QuickTest automation type library).
Что-то не нахожу я в QTP ничего похожего на Project > References, хотя скриншоту в хэлпе верю :) Или это только доступно при использовании Quality Center? Как тогда решить задачу средствами QTP 9.2?

ЗЫ. по форуму искал, VisualBasic add-in тоже на всякий случай включил.
  • 0

#2 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 27 августа 2008 - 13:42

Добрый день всем.
Есть задача эмулировать нажатие кнопок из теста. Пишу как в хэлпе:

set WshShell = WScript.CreateObject("WScript.Shell")WshShell.SendKeys "{LEFT}"
тест прерывается с ошибкой:
Run Error Object required: 'WScript'
Line (35): "set WshShell = WScript.CreateObject("WScript.Shell")".

В хэлпе написано, что WScript корневой объект и всегда доступен, ничего вроде как делать не надо, но есть загадочная фраза:
If you choose an environment that supports it, be sure to reference the QuickTest type library before you begin writing or running your automation script. For example, if you are working in Microsoft Visual Basic, choose Project > References to open the References dialog box for your project. Then select QuickTest Professional <Version> Object Library (where <Version> is the current installed version of the QuickTest automation type library).
Что-то не нахожу я в QTP ничего похожего на Project > References, хотя скриншоту в хэлпе верю :) Или это только доступно при использовании Quality Center? Как тогда решить задачу средствами QTP 9.2?

ЗЫ. по форуму искал, VisualBasic add-in тоже на всякий случай включил.


Visual Basic add-in здесь ни при чем.
Чтобы все заработало достаточно вместо Wscript.CreateObject написать просто "CreateObject".
Дело в том, что WScript - это корневой объект в объектной модели Windows Script Host, который отвечает за выполнение VBS и JScript скриптов в Windows. У этого объекта есть метод CreateObject, позволяющий создавать объекты ActiveX и олбращаться к ним из скрипта.
QTP же выполняет тесты через собственный движок и ничего не знает об объекте WScript. Для создания объектов ActiveX в QTP есть встроенная функция CreateObject, которой и надо в этом случае воспользоваться.
  • 0

#3 Slasher

Slasher

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

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

Отправлено 28 августа 2008 - 09:01

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

Эта штука судя по всему умеет работать с только win-приложениями, в частности, когда я пытаюсь этим способом имитировать ввод с клавиатуры в какое-нибудь поле web-приложения, значение набивается в активное поле самого вэб-браузера (например, адресная строка) а не в активное поле того, что в браузере открыто) (забавно выглядит)
Может есть какой способ заставить WshShell работать с содержимым? или я ошибся целиком в выборе метода решения задачи... Не подскажете, в каком направлении копать? :)
  • 0

#4 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 28 августа 2008 - 10:08

Эта штука судя по всему умеет работать с только win-приложениями, в частности, когда я пытаюсь этим способом имитировать ввод с клавиатуры в какое-нибудь поле web-приложения, значение набивается в активное поле самого вэб-браузера (например, адресная строка) а не в активное поле того, что в браузере открыто) (забавно выглядит)

Активное поле всегда одно в каждый момент времени. Если Вы хотите что-то ввести в любое поле с клавиатуры, то сначала Вам надо сделать его активным (установить туда фокус), а потом уже что-то вводить (именно так и делает пользователь - сначала кликает мышкой в поле - устанавливает фокус на это поле, а уже потом руками вводит символы).
Например, Вы сначала имитируете щелчок мыши, а потом уже запускаете SendKeys:
WebEdit("Имя Вашего поля ввода в объектном репозитарии").Click
WshShell.SendKeys "myText"

Может есть какой способ заставить WshShell работать с содержимым? или я ошибся целиком в выборе метода решения задачи... Не подскажете, в каком направлении копать? :)

Если Вам просто нужно вводить данные в поля формы, то проще воспользоваться методами тестовых объектов QTP (Например, Set для полей ввода (WebEdit), Select для списков (WebList)). Эти методы отлично писаны в документации. Поищите "WebList Object" или "WebEdit Object".
В этом случае Вы просто пишите
WebEdit("Имя Вашего поля ввода в объектном репозитарии").Set "myText"

  • 0

#5 Slasher

Slasher

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

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

Отправлено 28 августа 2008 - 11:19

Там не все так просто. В приложении используется KeyListener, который енаблит кнопку 'Submit' при вводе данных с клавиатуры. Поле формы у меня активно по умолчанию (допустим) т.е. при попытке руками начать что-то набивать данные вводятся в это поле. Само поле я описываю при помощи коллекции свойств:
[codebox]Set logfield=description.Create
logfield("html id").value="ext11"
logfield("Class Name").value="WebEdit"
logfield("Class Name").RegularExpression = False
logfield("html id").RegularExpression = False[/codebox]
далее, после проверки существования объекта, пытаюсь что-то там сделать:
[codebox]If Browser("...").Page("...").WebEdit(logfield).Exist(0) then
Browser("...").Page("...").WebEdit(logfield).Click 'после отработки команды ничего не происходит, кнопка выглядит активной как по умолчанию была
Browser("...").Page("...").WebEdit(logfield).Set value 'значение value установлено в поле, но кнопка продолжает быть выключеной, т.к. нет ввода с клавиатуры
Browser("...").Page("...").WebEdit(logfield).FireEvent "onchange" 'попросил разработчиков слушать евент - сделали, но ничего не происходит (кнопка в состоянии disabled)
WshShell.SendKeys "myText" 'myText' пишется в адресной строке браузера
Browser("...").Page("...").WebEdit(logfield).Set "2" ' 2 установлено в поле
Browser("...").Page("...").WebEdit(logfield).Click 'курсор в поле появился (чего не было при первой попытке кликнуть)
[/codebox]
то ли я чего-то не понимаю, то ли... на этом мысль останавливается...
  • 0

#6 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 28 августа 2008 - 13:01

Там не все так просто. В приложении используется KeyListener, который енаблит кнопку 'Submit' при вводе данных с клавиатуры. Поле формы у меня активно по умолчанию (допустим) т.е. при попытке руками начать что-то набивать данные вводятся в это поле.

Тогда советую попробовать посылать разные события, связанные с нажатием кнопок на клавиатуре (типа onkeypress), после выполнения метода webEdit.Set.
Полный список событий для Input контрола можно посмотреть в MSDN (надо нажать на ссылку Events).

Можно еще попытаться выполнить WebEdit.object.Focus чтобы установить фокус на контроле перед выполнением SendKeys.

Как попробуете, напишите о результатах. Если не поможет, будем думать дальше.
  • 0

#7 Slasher

Slasher

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

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

Отправлено 29 августа 2008 - 10:09

Прежде всего, спасибо за внимание к проблеме.
Тему, похоже, пора переименовывать в методы работы с WEB-объектами :)
Я тут кое-что поисследовал, нашел супер-кривой способ обойти проблему, и т.к. получил от руководства люлей за то что 2 дня не могу переделать тест под новое поведение кнопки, применил его (раньше кнопка 'Submit' была обычная и никаких вопросов не возникало)
Обошел так:
[codebox]Browser("...").Page("...").WebEdit(logfield).set "не_важно_что"
WshShell.SendKeys "{Tab}"
Browser("...").Page("...").WebEdit(logfield).set value[/codebox]
В этом случае приложением отрабатывается по моей просьбе добавленный "onchange" (приложение само его отрабатывает, я, как видно в коде, никакой триггер не активирую) и отрабатывает нажатие кнопки клавиатуры.
Почему SendKeys вбивал данные в адресную строку браузера:
после выполнения Browser("...").Navigate("...") адресная строка в браузере является активной (приложение загружено, адрес в строке подсвечен), собственно, туда и вбиваются данные. Если я руками пишу адрес, то поле адреса после перехода на страницу перестает быть активным (браузер IE7)
Как использовать события для INPUT контрола (по ссылке на MSDN) я честно говоря вообще не понял :( .
Игры с WebEdit.Object.Focus :
Browser("...").Page("...").WebEdit(logfield).Object.focus
никакой реакции
у меня вообще ощущение, что кроме object.set и exist с этим объектом ничего не работает. К нативным методам объекта я обратится не могу почему-то, штатные методы QTP тоже не работают кроме этих двух, ну и Click еще через раз.
Заметил некую странность - когда трассирую скрипт, в табе Watch в QTP состояние моего объекта Exist=False, но тем не менее проверка внутри скрипта Exist проходит, Set выполняется. Кстати, после Set Watch показывает Exist=True - это глюк табы или с моим объектом что-то не так? .Init не изменяет это состояние.
В общем, я в растерянности... Данную проблему криво, но обошел, а что там дальше будет уже теперь и не знаю...
  • 0


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

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