Как заставить функции Robot Framework принимать аргументы в виде строк вместо стандартного типа юникода
Я пишу новую RF-библиотеку, которая должна принимать строковые аргументы, потому что (существующая) библиотека Python, которую я использую, ожидает строки, а не юникода. Конечно, я могу преобразовать каждый Unicode в строку перед вызовом моей существующей функции, которая поддерживает только строки.
import ConfigParser
class RFConfigParser:
def get (self,section, option):
print type (section) #prints unicode
section = str (section) #works but I dont want to do this
return self._config.get (section, option) #this pre-existing function expect a string input
Проблема в том, что у меня много схожих функций, и в каждой из этих функций мне придется вызывать этот цирк с преобразованием юникода в строку.
Есть ли прямой способ сделать это, так что функция RF будет непосредственно принимать в строковом формате
Другой вопрос, поддерживает ли Unicode по умолчанию функцию Robot Framework или функцию RIDE? (Я использую RIDE, вот почему я получаю эту проблему)
2 ответа
Вы можете преобразовать эти строки Unicode в обычные строки, используя ключевое слово Evaluate, прежде чем передавать их в свою библиотеку.
Что-то вроде этого:
lib.py:
def foo(foo):
print type(foo)
test.txt
*** Settings ***
Library lib.py
*** Test Cases ***
demo
${bar} Evaluate str('bar')
foo ${bar}
Какое лучшее решение зависит от конкретной ситуации. Возможно, одним из решений является написание ключевого слова, которое выполняет это преобразование для вас, а затем вызывает библиотечную функцию. Возможно, лучший вариант - просто изменить вашу библиотеку, чтобы она принимала строки Unicode. Это зависит.
Если вы используете удаленную библиотеку, имейте в виду, что RobotFramework проверяет содержимое данных, которые будут транспортироваться через XmlRpc:
def _handle_binary_result(self, result):
if not self._contains_binary(result):
return result
try:
result = str(result)
...
Если данные содержат только ASCII, он будет переносить строку, если данные не могут быть закодированы в ASCII, он будет передавать двоичные данные. Я не знаю, как можно обеспечить принудительный тип результата в Юникоде и избежать жалоб на операцию сравнения, например " Должно быть равно", для разных типов данных:
Argument types are: <type 'str'> <type 'unicode'>
Если в моей удаленной библиотеке я делаю что-то вроде:
return unicode(result, 'utf-8')
для данного ввода получены результаты различного типа
return unicode(u'test', 'utf-8') --> 'test'
return unicode(u'ü', 'utf-8') --> u'ü'