Фреймворк робота Запустить ключевое слово, если не обновлять переменные в остальной части кода? - PullRequest
1 голос
/ 06 марта 2019

Я редактирую переменную в пользовательском ключевом слове, которое запускаю по условию при выполнении условия.Сначала я подумал, что аргументы не возвращаются, поэтому я создал глобальное ключевое слово и внес изменения в эту часть кода, а при возврате в main и записи в журнал этой переменной он все еще имеет значение, которое я объявил для этой глобальной переменной.Есть ли ошибка, которая не позволяет изменять переменные при запуске Run Keyword If?

Log

....
FOR  ${i}  IN RANGE  -1  -4  -1
     ${temp_names_cell} =  Get table cell  ${table_locator}  ${i}  1
     Loop columns  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}
     log  ${WORKAROUND}
     Set to dictionary  ${test}  ${temp_names_cell}  ${WORKAROUND}  #${temp_values_cell}
log dictionary  ${test}
END

Loop columns
    [Arguments]  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}
    ${column_name} =  Set variable
    FOR  ${j}  IN RANGE  1  ${column_count}+1  1
        ${column_name} =  get table cell  ${table_locator}  1  ${j}
        ${column_name} =  Replace string  ${column_name}  \n  ${SPACE}
        Run keyword if  "${column_name}" == "Short Term Backlog"   Get cell value  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
        log  ${temp_values_cell}
    END
    [Return]  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}

Get cell value
    [Arguments]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
    ${temp_values_cell} =  Get table cell  ${table_locator}  ${i}  ${j}
    ${WORKAROUND} =  Get table cell  ${table_locator}  ${i}  ${j}
    [Return]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}

1 Ответ

1 голос
/ 06 марта 2019

Вы описываете две отдельные проблемы - это не 2 вопроса, а два подхода к обмену состоянием, с которым вы столкнулись.

Позвольте мне заняться использованием "глобальной" переменной - ${WORKAROUND}, чтобы передавать информацию из ключевого слова (потому что это проще;) .

Поведение, которое вы видите из-за области видимости переменных. Рассмотрим этот псевдокод:

a = 5
print(a)  # 5

def keyword():
    a = 10
    print(a)

keyword()  # 10
print(a)   # 5?

Так почему последний print() выводит 5?
Потому что в области видимости это значение переменной. То, что происходит в keyword(), изолировано (по умолчанию) ; Вы создаете переменную, которая также называется «а», и присваиваете ей значение. В этот момент вы скрываете переменную «a» от внешней области видимости - она ​​продолжает существовать для программы, но больше недоступна из keyword(). Как только keyword() завершается, его «а» исчезает, а глобальное остается неизменным.
Кстати, этот список - python, на котором основан язык Robot Framework и принципы, которым он более или менее соответствует.

То же самое происходит с вашим кодом - переменная ${WORKAROUND} определена в регистре или ключевом слове, и вы определяете новую с тем же именем внутри Get cell value. Таким образом, все, что вы делаете с этим ключевым словом, не отражается на исходном во внешней области.

К счастью, существует простой обходной путь (в Robot Framework) - используйте Set Test Variable внутри ключевого слова, чтобы перезаписать переменную из внешней области видимости. Все последующие использования ${WORKAROUND} в этом случае будут иметь измененное значение. Есть также похожие ключевые слова Set Suite Variable и Set Global Variable, которые помещают переменную в более высокую (и самую высокую) область видимости.


Теперь второй случай - передача переменной в качестве аргумента и изменение ее внутри ключевого слова ~ method ~, в надежде, что она будет изменена в вызывающей области.

Я собирался написать что-то длинное и столь же скучное, как первая часть для передачи по значению по сравнению с передачей по ссылке, и привязки имен -> объектов, но - нет, я буду
а) оставьте это здесь - https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/, что объясняет, что плюс области лучше, чем у меня, и
b) переходите прямо к делу - проблема здесь та же, что и с областью действия локальной переменной.

В этом коде:

Get cell value
    [Arguments]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
    ${temp_values_cell} =  Get table cell  ${table_locator}  ${i}  ${j}

, вы заявляете, что ваше ключевое слово будет принимать аргумент, на который вы будете ссылаться с именем "temp_values_cell".
Но на следующей строке вы привязываете это имя к новому значению - новому месту в памяти; для вашего ключевого слова теперь есть только переменная "temp_values_cell", которая содержит результат Get table cell. И теперь он не имеет ничего общего с исходной переменной, которая использовалась в вызове ключевого слова.
Для внешнего мира - ничего не изменилось; исходная переменная, которую вы передали ключевому слову, не пострадает и не будет изменена.

И - Set Test Variable тут не поможет (почему - упражнение на потом:).

Традиционный способ - вернуть значение из ключевого слова и использовать его. Что вы делаете в своем примере кода - возвращайте значения, но не присваивайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...