Как сделать так, чтобы скрипт UFT пропускал ячейку в excel на основе меток на экране приложения

У меня есть очень динамичное приложение для автоматизации с помощью UFT. Метки на экране приложения изменяются в зависимости от ввода, предоставленного пользователем. У меня есть excel, где я установил значение поля для всех возможных полей, присутствующих в приложении. Проблема в том, что я хочу, чтобы мой сценарий UFT выбирал только те значения полей, для которых он находит имя поля на экране. Каждый раз, когда я запускаю сценарий, основанный на выборе whatever fields apppear на экране, я хочу, чтобы он выбирал только те соответствующие значения из листа excel и игнорировал другие значения в этом листе excel.

Например

Excel имеет следующие вейлы

Имя: Nancy
Ранг: 8
Хобби: Писать
Друг: Вероника
BFF: Karen

Но в приложении на экране появляются только следующие метки

Имя:
Хобби:
BFF:

Я хочу, чтобы скрипт UFT сравнивал метку поля на экране с меткой поля в excel и выбирал эти значения из excel (в данном случае имя, хобби, BFF) и игнорировал другие поля (класс и друг) .

Возможно ли это?

3 ответа

  1. Почему бы просто не использовать

    If Obj1.Exist(5) Then
        Obj1.Set ValueFromExcel1
    End if
    
    If Obj2.Exist(5) Then
       Obj2.Set ValueFromExcel2
    End if
    
  2. Предположим, ваше приложение представляет различные поля редактирования в форме для ввода, и вы используете объект DataTable для хранения файла Excel.

    Хорошо, вот что я бы сделал.

    Первый… Я собирал объекты в хранилище объектов. Я бы создал / записал каждое возможное поле редактирования как отдельный объект (внутри объекта для самого приложения), убедившись, что каждый объект уникально идентифицируется по имени… (если элементы управления поля редактирования сами по себе не имеют уникальных имен за кулисами, QTP предлагает возможность ссылки на подписи рядом с ними…). Кроме того, если приложение просто скрывает поля редактирования, убедитесь, что Visible=True является одним из идентичных атрибутов, таким образом, когда Visible=False, они не найдены.

    После того, как каждый объект находится в операционной, это простой вопрос проверки, если они существуют.

    'assuming your excel file is already imported as the global DataTable
    if Window("My App").Editbox("Name").exist(0) then Window("My App").Editbox("Name").Set DataTable("Name")
    if Window("My App").Editbox("Grade").exist(0) then Window("My App").Editbox("Grade").Set DataTable("Grade")
    if Window("My App").Editbox("Hobby").exist(0) then Window("My App").Editbox("Hobby").Set DataTable("Hobby")
    if Window("My App").Editbox("Writing Friend").exist(0) then Window("My App").Editbox("Writing Friend").Set DataTable("Writing Friend")
    if Window("My App").Editbox("BFF").exist(0) then Window("My App").Editbox("BFF").Set DataTable("BFF")
    

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

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

    j = Datatable.localsheet.GetRowCount
    
    For i = 1 to j
    Datatable.LocalSheet.SetCurrentRow i
    
    vout = trim(Datatable("Excel column name",dtlocalsheet))
    'Not sure about the following line
    vin = browser().page().Webtable().getcelldata(r,c)
    If not trim(Ucase(vout))= trim(Ucase(vin)) Then
    Datatable("Result",dtlocalsheet) = "Invalid Record"
    Do Until trim(Ucase(vout))= trim(Ucase(vin))
    i=i+1
    If i > j Then
    ExitAction  
    End IF
    Datatable.LocalSheet.SetCurrentRow I
    Datatable("Result",dtlocalsheet) = "Invalid Record"
    vout = trim(Datatable("Excel column name",dtlocalsheet))
    Loop
    End If