web-dev-qa-db-fra.com

Pour la boucle sur le dictionnaire dans Robot Framework

Existe-t-il un moyen approprié de parcourir un dictionnaire en RF? J'ai utilisé la méthode Pythonic, mais j'ai échoué:

:FOR  ${key}  ${value}  IN  &{dict}

sortie: Le nombre de valeurs de boucle FOR doit être multiple de ses variables. Vous avez 2 variables mais 1 valeur.

Pareil, quand j'ai désigné dictionnaire comme variable scalaire. Je n'ai cependant pas trouvé d'exemple dans la documentation ... Est-ce que quelqu'un a résolu ce problème?

P.S.

Je suis au courant de la solution de contournement, que vous utilisez kw. Obtenir les clés du dictionnaire et Obtenir les valeurs du dictionnaire, puis, pour mettre à jour les valeurs que vous utilisez Définir vers le dictionnaire $ {key} $ {new_value}, mais cela semble être humain désagréable et utilise plusieurs itérations de boucles for à la place d'une.

5
user2678074
Loop Through Dict
    &{mydict}    Create Dictionary    a=1    b=2
    :FOR    ${key}    IN    @{mydict.keys()}
    \    Log    ${mydict["${key}"]}

Loop Through Dict And Multiplicate Values
    &{mydict}    Create Dictionary    a=1    b=2
    :FOR    ${key}    IN    @{mydict.keys()}
    \    ${new_value}    Evaluate    ${mydict["${key}"]}*2
    \    Set To Dictionary   ${mydict}    ${key}=${new_value}
    Log    ${mydict}
9
Jan Kovařík

Pour parcourir les clés d'un dictionnaire, vous n'avez pas du tout besoin d'utiliser une méthode python, mais utilisez le modificateur @ de Robotframework pour développer la liste. Par exemple:

${mydict}    Create Dictionary    a=1    b=2
:FOR    ${key}    IN    @{mydict}
\    Log     The current key is: ${key}
# there are at least to ways to get the value for that key
# "Extended variable syntax", e.g. direct access:
\    Log     The value is: ${mydict['${key}']}
# or using a keyword from the Collections library:
\    ${value}=    Get From Dictionary    ${mydict}    ${key}
\    Log     The value through Collections is: ${value}

La boucle sur les clés fonctionne tout de suite, car en python une distribution list() d'un dictionnaire est en fait la liste de ses clés. Exemple de code:

mydict = {'a': 1, 'b': 2}
print(list(mydict))
# the output is 
# ['a', 'b']

Il existe une méthode dict de python, items(), qui parcourt le dictionnaire et renvoie un tuple de clé, valeur. Malheureusement, Robot Framework ne peut se substituer directement aux boucles, mais cela peut être fait avec le mot clé Get Dictionary Items . Il retourne une liste unidimensionnelle, sous la forme 

['key1', value_of_key1, 'key2', value_of_key2,]

En combinant cela avec l’extension de liste @, vous pouvez obtenir à la fois la clé et la valeur dans chaque cycle:

${mydict}    Create Dictionary      a=1    b=2
${items}     Get Dictionary Items   ${mydict}

:FOR    ${key}    ${value}    IN    @{items}
\    Log     The current key is: ${key}
\    Log     The value is: ${value}
5
Todor Minakov

Une autre solution consiste à utiliser le mot clé "Obtenir du dictionnaire" lors de la boucle for.

Loop through and Log key and value in dict
    [Documentation]    Loops through each key and stores the key value 
    ...                in a variable that can be used during the for 
    ...                loop, as if you were iterating through python 
    ...                with "for key, value in dict.iteritems()".
    &{mydict}    Create Dictionary    a=1    b=2
    :FOR    ${key}    IN    @{mydict.keys()}
    \    ${value}=    Get From Dictionary    ${mydict}    ${key}
    \    Log    ${key}, ${value}

référence: http://robotframework.org/robotframework/latest/libraries/Collections.html#Get%20From%20Dictionary

2
chmcc

vérifier les solutions:

:FOR    ${key}    IN    @{mydict}
# works as @{mydict.keys()}

:FOR    ${key}    ${value}    IN    @{mydict.items()}
# doesn't work at all

Trouvé une autre solution qui fonctionne:

:FOR    ${key}     ${value}    IN Zip    ${mydict.keys()}    ${mydict.values()}

# And another less readable (can work without setters)
:FOR    ${el}    IN    @{mydict.items()}   
\    ${key}=    Set Variable    ${el[0]}
\    ${value}=    Set Variable    ${el[1]}
2
Viacheslav Tkach