QTP 9.0 - Видимость переменной
#1
Отправлено 10 ноября 2006 - 15:33
Test Flow:
Значит есть всего 4 Action:
Object_Creator
Object_Editor
Object_Editor_DopOperations
Object_HistoryValidator
Три из них - Reusable:
Object_Editor
Object_Editor_DopOperations
Object_HistoryValidator
Как понятно из Test Flow Object_Editor и Object_Editor_DopOperations зависят от Object_Creator и, соответственно, вызываются из него:
RunAction "Object_Editor", allIterations
RunAction "Object_Editor_DopOperations", oneIteration
В Object_Creator есть переменная, она определена как:
Public MyDate
MyDate = Date
Так вот, эту переменную я вначале определял непосредственно в польз. биб. и моя функция работала замечательно, но в этом случае я не мог использовать зн-ие это переменной в Action's
Затем я перенес эту переменную в Object_Creator и стал передавать ее как параметр функции из библиотеки П. :
В скрипте:
Public MyDate
MyDate = Date
call CheckUtilSecond(Utilization, MyDate)
В ПБ:
Public Function CheckUtilSecond(Utilization, MyDate)
If Utilization = "списан" OR Utilization = "продан" Then
SwfWindow("Система материального").SwfWindow("Объект учета № 217531").SwfEdit("SwfEdit_12").Set MyDate
End If
End Function
Проблема в том, что при вызове функции
call CheckUtilSecond(Utilization, MyDate)
из Action Object_Editor в библиотеку переменная MyDate передается как Empty, но если в этом Action ее еще раз опубликовать, то она будет передана корректно.
И так, переменная MyDate опубликованная в Object_Creator не видна в Object_Editor
Почему и что делать???
#2
Отправлено 10 ноября 2006 - 16:46
2) Переменные, объявленные в одном экшене НИКОГДА не видны ни из других экшенов, ни из библиотек
3) Использование глобальных переменных в библиотеках - это в принципе не наш стиль. Лучше переменную объявлять в библиотеке как private, a доступ к ней осуществлять через функции (то есть 2 функции написать - getVar и setVar, где Var - имя переменной)
4) Есть 2 ПРАВИЛЬНЫХ способа передачи переменных между экшенами -
- через параметры экшена
- используя user-defined переменные объекта Environment (см. Help)
Майк.
#3
Отправлено 13 ноября 2006 - 15:16
Еще - передача через параметры Action - эта идея мне приходила в голову, но реализация ее никак не удавалась не смотря на чтение доки. Допустим, нужно передать переменную типа Date из одного Action1 в Action2. Я в Action1 устанавливаю Output [имя переменной], а в Action2 Input [имя переменной]. Ну и соответственно ничего не получается...
#4
Отправлено 13 ноября 2006 - 20:44
Library code:
private i_globalvar sub setGlobalVar (byval newval) i_globalvar = newval end sub function getGlobalVar () getGlobalVar = i_globalVar end function
Action 1:
setGlobalVar "ValueFromAction1"
Action 2
Dim localVar localVar = getGlobalVar()
Так понятно?
2) Вероятно, Вы просто не поняли, где выставлять значения параметров и как их использовать. Поясняю:
Параметры action'a объявляются в Action Properties, а устранавливаются в Action Call Properties (в KeyWord view правой кнопкой мыши по вызову экшена и выбрать из меню)
Пример использования
В экшене 1 - параметр inVar1 (входной) и outVar1 - выходной (картинка 1) В экшене 2 - параметр входной - invar2 (картинка 2)
В keyword view правой кнопкой мышки по вызову экшена 1->Action Call Properties (картинка 3) -> выставить inVar1 (картинка 4) -> там же - сохранить значение outVar1 в Environment("outVar1") (картинка 5)
Аналогично action call properties для Action2 -> выставить inVar1 - Environment("outVar1") - картинка 6
Теперь Action 1:
Parameter("outvar1")=Parameter("invar1") + " and blah-blah-blah"
Action 2:
Reporter.ReportEvent micDone,"invar2 value","invar2 value is:"&Parameter("invar2")
3) Environment - переменные. Лень писать - может прочитаете в Help или у меня в статье про QTP?
Прикрепленные файлы
Майк.
#5
Отправлено 14 ноября 2006 - 11:03
private Utilization
sub setUtilization (byval newval)
Utilization = newval
end sub
function getUtilization ()
getUtilization = Utilization
end function
В Object_Creator:
SetUtilization = SwfWindow("Система материального").SwfWindow("Объект учета № 217531").SwfEdit("SwfEdit_6").GetROProperty("regexpwndtitle")
Вылетает ошибка: General Run Error, если сделать call SetUtilization, то кричит что объект SetUtilization не найден.
#6
Отправлено 14 ноября 2006 - 12:51
()
#7
Отправлено 15 ноября 2006 - 12:15
Статья по поводу Environment ?
Если это она:
http://software-test...ury-qtp-faq.htm
То кроме абзаца:
"Environment — это коллекция типа Dictionary, содержащая пары ключ — значение, которая видна из всех Actions и из библиотек. Кроме того, Environment содержит многие встроенные значения, относящиеся к текущей сессии исполнения теста, такие как имя пользователя, имя компьютера, имя теста, опции исполнения и т.п. Environment имеет смысл использовать для хранения пользовательских настроек библиотек."
примеров нет. Что такое Environment - я прочел и в доке, и про параметры я в доке прочел. Даже вроде бы как примеры есть. Но не смотря на это как конкретно их сипользовать мне, если честно, не ясно...
Последовал вашему примеру, все сделал по шагам, в итоге в Action1 - "Parameter invar1 not found."
Задачка1:
Action1:
Есть передача полученного зн-ия в SetUtilization
SetUtilization(SwfWindow("Система материального").SwfWindow("Объект учета № 217531").SwfEdit("SwfEdit_6").GetROProperty("regexpwndtitle"))
В Action2 мне еще раз нужно получить зн-ие SetUtilization(SwfWindow("Система материального").SwfWindow("Объект учета № 217531").SwfEdit("SwfEdit_6").GetROProperty("regexpwndtitle"))
Могу я как-то еще раз просто вызвать SetUtilization в Action2 из Action1 что бы не прописывать тоже самое?
Задачка2:
Собственно просто передать зн-ие переменной MyDate из Action1 в Action2
#8
Отправлено 15 ноября 2006 - 14:16
примеров нет. Что такое Environment - я прочел и в доке, и про параметры я в доке прочел. Даже вроде бы как примеры есть. Но не смотря на это как
конкретно их сипользовать мне, если честно, не ясно...
Не знаю, чего тут неясного. В одном экшене пишете что-то типа
Environment("myvar")="myvalue"
, а во втором Action - используете эту переменную, например
Reporter.ReportEvent micDone,"Environment myvar","Environment myvar value is:" & Environment("myvar")
Последовал вашему примеру, все сделал по шагам, в итоге в Action1 - "Parameter invar1 not found."
Ну да. Они case-sensitive, а я плохо просмотрел свой пример, сорри . Попробуйте везде имена параметров писать маленькими буквами - поможет.
Задачка1:
Action1:
Есть передача полученного зн-ия в SetUtilization
SetUtilization(SwfWindow("Система материального").SwfWindow("Объект учета № 217531").SwfEdit("SwfEdit_6").GetROProperty("regexpwndtitle"))
В Action2 мне еще раз нужно получить зн-ие SetUtilization(SwfWindow("Система материального").SwfWindow("Объект учета № 217531").SwfEdit("SwfEdit_6").GetROProperty("regexpwndtitle"))
Могу я как-то еще раз просто вызвать SetUtilization в Action2 из Action1 что бы не прописывать тоже самое?
Не понял... Идея была очень простая - установить /записать значение переменной - функция SetVar (где Var - имя переменной), чтобы получить это записанное значение - функция getVar (где Var - имя переменной). То есть, в Action2 используете getUtilization().
А вообще, сдаётся мне, Вам надо купить хорошую книжку по программированию, скажем, на VBA, и целиком её пройти, выполнив все примеры, не сочтите за наезд . Хотя, конечно, может это я упорно торможу .
Майк.
#9
Отправлено 15 ноября 2006 - 15:44
В принципе да, Задачка1 отношения к теме топика не совсем имеет.
SetUtilization(SwfWindow("Система материального").SwfWindow("Объект учета № 217531").SwfEdit("SwfEdit_6").GetROProperty("regexpwndtitle"))
я хотел вызвать еще раз из Action1, так как по ходу выполнения Action2 regexpwndtitle поменяло значение, так как я вызываю функцию из библиотеки CheckUtilFirst(), которая постоянно проверяет Utilization:
Public Function CheckUtilFirst()
If Utilization = "списан" Then
Бла Бла Бла
End if
мне при вызове этой функции (и многих других) нужно всегда иметь текущее зн-ие Utilization.
А по поводу хорошей книжки по программированию на VBA - это я бы тоже постоветовал, причем многоим, даже Вам! Сам уже купил и приступил к изучению. Только вот засада, ни Access Basic, ни Word Basic мне совсем не нужны. Нужен простенький VBScript (уреазнный VBA), а по нему ни книжек ни справочников нет :(
А в идеале хорошую книгу по VBScript на примерах QTP... Что-то я уже размечтался...
#10
Отправлено 06 августа 2009 - 10:35
Первый актион:
'Dim id Оно нужно ? Environment("id") = Browser("Browser").Page("test").Link("test").GetTOProperty("href")второй актион
Reporter.ReportEvent micDone,"Environment id","Environment id value is:" & Environment("id") 'логику этой строчки вообще непонимаю Browser("Browser").Page("test").WebEdit("poid").Set Right(id, 16)все настройки выполнены как на кортинках.
в первом актионе, выходное значение переменной
name: id
Store In: |- Output Typr: Environment
|- Name: id
во втором актионе
входноая переменная:
name: id
Value: |- Parametr: Environment
|- Name: id
|- Value: <пусто>
Что делаю нетак ?
#11
Отправлено 06 августа 2009 - 11:33
Что делаю нетак ?
А как делаете?
Здесь все понятно написано и это работает:
Не знаю, чего тут неясного. В одном экшене пишете что-то типа
Environment("myvar")="myvalue"
, а во втором Action - используете эту переменную, напримерReporter.ReportEvent micDone,"Environment myvar","Environment myvar value is:" & Environment("myvar")
Ну логично, что action, в котором заполняется Environment("myvar") должен вызываться раньше action, в котором Environment("myvar") используется. У вас так используется?
P.S. Кстати, в соседней ветке вам советовали поставить spell-checker - действительно, поставьте...
#12
Отправлено 06 августа 2009 - 12:14
Что делаю нетак ?
А как делаете?
Здесь все понятно написано и это работает:Не знаю, чего тут неясного. В одном экшене пишете что-то типа
Environment("myvar")="myvalue"
, а во втором Action - используете эту переменную, напримерReporter.ReportEvent micDone,"Environment myvar","Environment myvar value is:" & Environment("myvar")
Ну логично, что action, в котором заполняется Environment("myvar") должен вызываться раньше action, в котором Environment("myvar") используется. У вас так используется?
P.S. Кстати, в соседней ветке вам советовали поставить spell-checker - действительно, поставьте...
во втором актионе в коромом пишу
Reporter.ReportEvent micDone,"Environment myvar","Environment myvar value is:" & Environment("myvar")переменная будет также доступна под именем myvar ? каким образом к ней обращаться ?
Browser("Browser").Page("ACE XML Gateway Manager_5").WebEdit("poid").Set Right(myvar, 16)вот так ?
Ниже будет, много грамматических ошибок, spell-cheker обязательно потом поставлю :)
Щас прям по шагам все распишу, а вы меня поправьте где не правильно.
Action1_1
там такие строчки кода:
'... ' нету никаких определений переменных, ничего особенного, просто перехожу на нужную страничку Environment ("id")= Browser("Browser").Page("ACE XML Gateway Manager_3").Link("test").GetTOProperty("href") ' опять ничего особенного, проста кликаю на ссылиНужно ли тыкать на этом action правой кнопкой и заходить в Action Propertis и выставлять там Output параметры ?
Что там писать в name ? и что потом в Store In писать ? Меня интересуют какокретно какие названия переменных где должны быть написаны.
Action1_2
Reporter.ReportEvent micDone,"Environment СДЕСЬ_ПИСАТЬ_ЧТО","Environment А_СДЕСЬ_ЧТО_ПИСАТЬ value is:" & Environment("И_ВОТ_СДЕСЬ_ЧТО_ПИСАТЬ") Browser("Browser").Page("test").WebEdit("poid").Set Right(СЮДА_НАДО_ВЫХОДНОЙ_ПАРАМЕТР_ИЗ_action1_1, 16)
я еще в предылущем посту написал как я делаю. Еще раз написал, и пометил где меня конкретные вещи интересуютА как делаете?
Если было бы все понятно и работало яб наверно не постил глупые посты.
Пожалуйста, неовечайте односложными фразами, аля "да тут все ясно", "да все работает", "а в чем проблема".
Я походу теряюсь в переменных, немоглибы вы прям на моем примере написать какие переменные и куда вписывать. Буду очень благодарен.
Я сча рожу, чеж некто ненаписал что после строчки
Reporter.ReportEvent micDone,"Environment myvar","Environment myvar value is:" & Environment("myvar")
надо использовать не как id а как Environment("id") :(
Теперь все работает, вродебы.
#13
Отправлено 06 августа 2009 - 13:09
Я сча рожу, чеж некто ненаписал что после строчки
Reporter.ReportEvent micDone,"Environment myvar","Environment myvar value is:" & Environment("myvar")
надо использовать не как id а как Environment("id") :(
Теперь все работает, вродебы.
Из всей этой тирады выше это ключевые слова - я так понял, что все получилось :)
Если вы внимательно прочитаете тот фрагмент от "Mike @ 15.11.2006, 17:16" - то там именно и написано что использовать созданную и заполненную переменную надо через Environment.
А что никто не написал - ну так читайте внимательно уже написанное, сэкономит массу времени и в муках рожать не придется ;)
#14
Отправлено 06 августа 2009 - 13:54
1. Локальные переменные сценария (так по-русски action'ы называются). Они объявляются в самом сценарии через Dim myLocalActionVar. Область их видимости - только тот сценарий, в котором они объявлены.
2. Environment-переменные, реализованные через специальный объект QuickTest Pro — Environment. Фактически это словарь с возможностью экспорта/импорта в xml. Синтаксис работы с такими переменными следующий:
Environment("MY_CASE_SENSITIVE_ENV_VAR") = "someValue" 'задание значения для Environment-переменной Print Environment("MY_CASE_SENSITIVE_ENV_VAR") 'получение значения из Environment-переменной.Область видимости Environment-переменных — весь код. Однако, необходимо иметь ввиду, что если попытаться использовать неопределенную Environment-переменную (т.е. такую, значение которой еще не было задано), то Вы получите ошибку. Следует учесть, что имена Environment-переменных регистрозависимы (поскольку они сделаны на основе словарей, ключи которых всегда регистрозависимы). На самом деле, можно задавать пользовательские переменные непосредственно в настройках теста или загружать их из xml-файла. Узнать, как это делать, можно, прочитав соответствующую тему в справке QTP.
3. Параметры сценариев, которые могут быть входные и выходные. Задаются они в диалоге Action Properties. Параметры видны только внутри конкретного сценария, однако при вызове данного сценария можно передать значения входным параметрам сценария и указать переменные, куда будут сохранены значения выходных(output) параметров.
Синтаксис использования параметров такой:
Print "Input parameter value " & Parameter("MY_CASE_SENSITIVE_INPUT_PARAMETER") 'получение значения из Input-параметра Parameter("MY_CASE_SENSITIVE_OUTPUT_PARAMETER") = someOutputValue 'задание значения для output-параметра 'Вызов сценария с передачей ему параметров: RunAction "ИМЯ_СЦЕНАРИЯ", "ПАРАМЕТРЫ_ИТЕРАЦИЙ", ЗНАЧЕНИЯ_ВХОДНЫХ_ПАРАМЕТРОВ, ПЕРЕМЕННЫЕ_КУДА_СОХРАНЯТЬ_OUTPUT_ПАРАМЕТРЫ
SQL для тестировщиков
Тренинги по HP QTP и автоматизации тестирования
Если минарет, значит выше всех (с)
#15
Отправлено 07 августа 2009 - 07:25
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных