Возвращаемое значение с кириллицой в Databaselibrary RobotFramework

Продолжить обсуждение из DatabaseLibrary как получить одно значение из выборки:

Для внутреннего форума я писал такую подсказу (на основе [OracleDB][1], но должно быть понятно)

​В случае получения данных из БД могут появится проблемы с кодировкой русского текста. Например, при использовании следующих конструкций

(1)
${sql_string}=  catenate  SELECT 'Значение' FROM dual
@{res}=  Query  ${sql_string}
 

(2)
${sql_string}=  catenate  SEPARATOR=${\n}  DECLARE
...                                          lv_1  VARCHAR2(100);
...                                          lv_2  VARCHAR2(100);
...                                        BEGIN
...                                          SELECT 'Значение 1', 'Значение 2'
...                                            INTO lv_1, lv_2
...                                            FROM dual;
...                                          dbms_output.put_line(lv_1);
...                                          dbms_output.put_line(lv_2);
...                                        END;
@{res}=  OracleDB.execute_plsql_block_with_dbms_output  ${sql_string}

будет получено следующее:

    (1)
    ${res} = [('\xc7\xed\xe0\xf7\xe5\xed\xe8\xe5',)] 
     
    (2)
    @{res} = [ \xc7\xed\xe0\xf7\xe5\xed\xe8\xe5 1 | \xc7\xed\xe0\xf7\xe5\xed\xe8\xe5 2 ] 

Для декодирования полученных строк необходимо использовать keyword 'Decode Bytes To String' (библиотека [String][2]):


(1)
${decoded_res}= Decode Bytes To String ${res[0][0]} windows-1251

(2)
${decoded_res_1}= Decode Bytes To String ${res[0]} windows-1251
${decoded_res_2}= Decode Bytes To String ${res[1]} windows-1251



  [1]: https://github.com/dmizverev/robot-framework-library/blob/master/library/OracleDB.py
  [2]: https://code.google.com/p/robotframework/wiki/StringLibrary
2 лайка

@DmitriyZverev А ты не писал заметку по этому поводу?

Да, спасибо, мне как раз нужно для OracleDB

Нет, я думал, что это не стоит внимания.
Вообще, в закромах моего Evernote есть маленькие заметки. По сравнению с большими статьями они ерунда, но в жизни помогали.
Сейчас есть свободный час: напишу про интеграцию с TestLink

1 лайк

Ну так доставай из Evernote и выкладывай. А большая или маленькая - это роль не играет, если кому-то пригодиться.

как ни странно такой кейворд не видит Decode Bytes To String, хотя у меня стоит Robot Framework 2.8.1

Вы библиотеку String подключили?

Лучше покажите код теста.

да, библиотека подключена:

*** Settings ***
Suite Setup
Test Setup
Test Teardown
Force Tags        test
Library           OperatingSystem
Library           Dialogs
Library           String

split string и остальные старые кейворды работают, а Decode и encode bytes To String - нет

Кейворд работает, но не подсвечивается синим цветом, поэтому и подумал что с ним проблема.

Хорошо, что Вы разобрались.

После недели кодинга в RIDE, как правило, переходишь в Eclipse или Sublime и начинаешь помнить все кейворды и подключенные библиотеки наизусть :slight_smile:

да ладно тебе, скажи что ты полностью отказался от RIDE и все тесты пишешь через Eclipse?

Пишу исключительно в Eclipse

Группы тестов запускаю в RIDE. В нём есть очень полезная функция: pause on failure.

Такая ситуация: выбираю значение с веб-страницы с selenium2libary.get text, добавляю его в список ${textlist} с помощью append to list, и потом мне нужно выбрать из БД все остальные записи, кроме тех что в списке:

если указываю конкретное значение:

query select * from table where description not in (’${textlist[1]}’)

то все правильно, но мне нужно все значения в списке:

query select * from table where description not in (’@{textlist}’)
а так не работает, список в выборку попадает в unicode формате

Дописал os.environ[‘NLS_LANG’] = ‘American_America.AL32UTF8’ в connection_manager.py, но ситуация не изменилась.

Решил следующим образом: вместо списка каждое значение дописал в файл, потом все содержимое файла взял с помощью get file, и это значение использовал в выборке, так не возникает проблем с кириллицей.
Может есть более простой способ?

А у вас бы этот способ и не прошёл бы, т.к. вы объект типа list пытаетесь подсунуть строке.

Замечание: в библиотеке OracleDB нет привидения типов, там всё - строка.

1 лайк