Запустить ключевое слово, если ключ существует в словаре (Robot Framework) - PullRequest
1 голос
/ 16 января 2020

В настоящее время я использую Robot Framework для автоматизации тестов для формы. Для подачи данных формы я использую словари, подобные этим:

*** Variables ***
&{TestCase1}    key1=a    key2=b    key3=c    key4=d
&{TestCase2}    key2=x    key3=y

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

*** Keywords ***
Fill Form
    [Arguments]    &{TestCase}
    Run Keyword If    &{TestCase}[key1]    Input Text    id=field1    &{TestCase}[key1]
    Run Keyword If    &{TestCase}[key2]    Input Text    id=field2    &{TestCase}[key2]
    Run Keyword If    &{TestCase}[key3]    Input Text    id=field3    &{TestCase}[key3]
    Run Keyword If    &{TestCase}[key4]    Input Text    id=field4    &{TestCase}[key4]

... но безрезультатно. Я получаю эту ошибку:

FAIL: Dictionary &{TestCase} has no key 'key1'.

... что в некоторой степени имеет смысл, потому что это не так, но в этом суть. Я ожидал, что это заставит условие оценить False и заставить RF пропустить ключевое слово.

Может кто-нибудь объяснить, почему это не работает таким образом, и если есть другой способ сделать это? Любая помощь с благодарностью!

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Вам необходимо проверить наличие ключа, а не значения. В python это будет выглядеть как if 'key1' in TestCase, поэтому в синтаксисе робота это будет выглядеть так:

Run keyword if  'key1' in $TestCase  Input Text  ...

Вот полный пример. При запуске следует добавить «ключ1 находится в журнале, как и ожидалось», но не «поддельный неожиданно в журнале»

*** Variables ***
&{TestCase1}    key1=a    key2=b    key3=c    key4=d
&{TestCase2}    key2=x    key3=y

*** Test Cases ***
Example
    Run keyword if  'key1'  in $TestCase1  log  key1 is in the log as expected
    Run keyword if  'bogus' in $TestCase1  log  bogus is unexpectedly in the log
1 голос
/ 16 января 2020

Как подчеркивают @Swapnil и @Bryan, есть несколько способов добиться этого. В приведенном ниже примере используется сопоставление для комбинации ключ / идентификатор поля, а затем тестовый пример, который предоставляет пары ключ-значение. Скрипт заполнения просто выполняет для l oop и не заботится о количестве полей. Ключевое слово Input Text имитируется пользовательским для входа в консоль.

*** Settings ***
Library    Collections    

*** Variables ***
&{mapping}
    ...    key1=field1    key2=field2
    ...    key3=field3    key4=field4

*** Test Cases ***
Test Case 1
    &{testcase}    Create Dictionary
    ...    key1=value1   key3=value3
    ...       
    Log to Console    \n    #For Formatting purpose
    Fill Form    ${testcase}    ${mapping}

Test Case 2
    &{testcase}    Create Dictionary
    ...    key1=value1    key3=value3   
    ...    key2=value2

    Log to Console    \n    #For Formatting purpose
    Fill Form    ${testcase}    ${mapping}

*** Keywords ***
Fill Form
    [Arguments]    ${fields}    ${mapping}
    ${keys}    Get Dictionary Keys    ${fields}    

    FOR    ${key}    IN    @{keys}
        Input Text    id=${mapping}[${key}]    ${fields}[${key}]
    END 

Input Text
    [Arguments]    ${locator}    ${value}
    Log To Console   Test Name: "${TEST NAME}" Locator: [${locator}] Value: "${value}"

Даст следующий результат:

==============================================================================
Test Case 1                                                           

Test Name: "Test Case 1" Locator: [id=field1] Value: "value1"
Test Name: "Test Case 1" Locator: [id=field3] Value: "value3"
| PASS |
------------------------------------------------------------------------------
Test Case 2                                                           

Test Name: "Test Case 2" Locator: [id=field1] Value: "value1"
Test Name: "Test Case 2" Locator: [id=field2] Value: "value2"
Test Name: "Test Case 2" Locator: [id=field3] Value: "value3"
| PASS |
------------------------------------------------------------------------------
...