web-dev-qa-db-fra.com

IF ELSE dans un cadre de robot avec affectation de variables

J'ai besoin d'exécuter certains mots-clés de manière conditionnelle dans un framework de robot, mais je ne sais pas comment le faire, cela ne fonctionne pas. J'ai essayé de nombreuses options, mais je suppose que la déclaration "IF-ELSE" est complètement fausse.

Choose Particular Filter ${FILTER} And Uncheck All Values
    ${bool}=   is filter opened   ${AVAILABLE FILTERS}   ${FILTER}
    ${uncheck_all_button}=    run keyword  if    "${bool}" == "True"   uncheck all in filter  ${AVAILABLE FILTERS}   ${FILTER}
    ...                       click element   ${uncheck_all_button}
    ...                       ELSE
    ...                       Set variable    ${particular_filter}:    find particular filter   ${AVAILABLE FILTERS}  ${FILTER}
    ...                       click element   ${particular_filter}
    ...                       Set variable    ${uncheck_all_button}:   uncheck all in filter  ${AVAILABLE FILTERS}   ${FILTER}
    ...                       click element   ${uncheck_all_button}

Il échoue avec: Variable '${particular_filter}' not found. Mais au cas où je le lancerais, il ne devrait même pas aller à la branche ELSE car $ {bool} est True ... Ma fonction personnalisée is filter opened vérifie si le filtre est déjà ouvert - si tel est le cas, renvoie True. Ma fonction personnalisée uncheck all in filter renvoie simplement XPATH du bouton "décocher tout". Ma fonction personnalisée find particular filter renvoie XPATH du bouton "liste déroulante des filtres". Dans tout ce mot-clé, je dois vérifier si le menu déroulant du filtre est déjà ouvert. Si c'est le cas, je dois alors cliquer directement sur ${uncheck_all_button}, sinon si le menu déroulant du filtre n’est pas encore ouvert, je dois d’abord cliquer sur le filtre lui-même ${particular_filter} et ensuite je peux cliquer sur ${uncheck_all_button}

J'ai aussi essayé la ligne "lancer le mot clé" pour avoir comme ceci:

${uncheck_all_button}=    run keyword  if    "${bool}" == "True"    Set Variable    uncheck all in filter    ${AVAILABLE FILTERS}    ${FILTER}

ou ca:

run keyword  if    "${bool}" == "True"   ${uncheck_all_button}=    uncheck all in filter    ${AVAILABLE FILTERS}    ${FILTER}

J'ai aussi essayé avec ${bool} == "True" et ${bool} == True

Mais rien ne fonctionne vraiment, toujours la même erreur :(

Merci beaucoup pour toute aide!

14
neliCZka

Avoir IF/THEN/ELSE avec plusieurs instructions dans chaque bloc ne fonctionne pas dans Robot (sinon vous devrez utiliser "Mots clés", je suppose, mais cela deviendrait illisible). Donc, je refactoriser votre code de cette façon:

Choose Particular Filter ${FILTER} And Uncheck All Values
    ${is_filter_opened}=   is filter opened   ${AVAILABLE FILTERS}   ${FILTER}
    run keyword  if    ${is_filter_opened}    actions_when_unchecked
    ...                ELSE  actions_when_checked

actions_when_unchecked
    uncheck all in filter  ${AVAILABLE FILTERS}   ${FILTER}
    click element   ${uncheck_all_button}

actions_when_checked    
    ${particular_filter}:    find particular filter   ${AVAILABLE FILTERS}  ${FILTER}
    click element   ${particular_filter}
    ${uncheck_all_button}:   uncheck all in filter  ${AVAILABLE FILTERS}   ${FILTER}
    click element   ${uncheck_all_button}   

J'espère que cela t'aides.

10
Laurent Bristiel

Selon la syntaxe ci-dessous, mettez votre code à jour et vérifiez-le.

Syntaxe pour IF-ELSE:

   Run Keyword If    '${Condition}'== 'True'    Run Keywords    <Keyword 1>     <Keyword 2>
   ...    ELSE    <Keyword 1>

Syntaxe pour "Définir la variable" en fonction de la condition:

 ${Status}=    Run Keyword If    '${Condition}'== 'True'    Set Variable    <Yes>    <No>

Selon votre code dans la partie SI,

si "bool = true", il n'exécutera que le mot clé personnalisé "désélectionner tout le filtre", mais pas le mot clé "Elément de clic". Si vous voulez que les deux mots-clés soient exécutés en fonction de la condition, utilisez le mot-clé "Run Keywords" comme indiqué dans la syntaxe IF-ELSE.

9
Rakesh

Merci beaucoup, Laurent, ta solution est la bonne! Je devais juste faire quelques petits changements pour que cela fonctionne:

Choose Particular Filter ${FILTER} And Uncheck All Values
${is_filter_opened}=   is filter opened   ${AVAILABLE FILTERS}   ${FILTER}
run keyword if      ${is_filter_opened}    actions_when_unchecked ${FILTER}
...                ELSE  actions_when_checked ${FILTER}

actions_when_unchecked ${FILTER}
${uncheck_all_button}=  uncheck all in filter  ${AVAILABLE FILTERS}   ${FILTER}
click element   ${uncheck_all_button}

actions_when_checked ${FILTER}
${particular_filter}=    find particular filter   ${AVAILABLE FILTERS}  ${FILTER}
click element   ${particular_filter}
${uncheck_all_button}=   uncheck all in filter  ${AVAILABLE FILTERS}   ${FILTER}
click element   ${uncheck_all_button}
1
neliCZka
${error_status} Set Variable    False       
log ${error_status}         
Run Keyword If  ${error_status} calltrue    ELSE    login_sucessful

calltrue and login_sucessful are keywords it can be any keyword of your choice. so in this case login_sucessful  keyword is executed. if error_status is set to true then calltrue function will get executed.

Faites attention à l'indentation, un seul espace gâchera votre flux d'exécution

0
MD5