Как заставить функции 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'ü'
Другие вопросы по тегам