Robotframework «Выбрать файл» вызывает ошибку атрибута: модуль ‘base64’ не имеет атрибута ‘encodestring’ в docker

#python #docker #upload #base64 #robotframework

#python #docker #загрузка #base64 #robotframework

Вопрос:

Я пытаюсь запустить тест в контейнере docker, который выполняется локально без проблем: я хочу загрузить правильный CSV-файл из «правильного» каталога

 *** Keyword ***
Upload file
    [Arguments]    ${directory}    ${file}
    Choose File    ${choose_file_input}    ${EXECDIR}/Files/${directory}/${file}

** Test case ***
Upload
    Upload file    correct    correct.csv
 

Но при запуске теста в docker я получаю СБОЙ с ошибкой атрибута: модуль ‘base64’ не имеет атрибута ‘encodestring’. Это потому, что в docker нет графического интерфейса? или кодировку нужно исправить? Или, в конце концов, может быть, есть другое решение, которое я могу использовать для загрузки файлов?

 15:20:01.250    INFO    Sending /App/Files/correct/correct.csv to browser.  
15:20:01.251    DEBUG   POST http://192.168.1.29:4444/wd/hub/session/4b6d453b394adaaa51bb4149e9ba8678/elements {"using": "xpath", "value": "//div[@id="upload"]//input"}  
15:20:01.252    DEBUG   Starting new HTTP connection (1): 192.168.1.29:4444 
15:20:01.305    DEBUG   http://192.168.1.29:4444 "POST /wd/hub/session/4b6d453b394adaaa51bb4149e9ba8678/elements HTTP/1.1" 200 90   
15:20:01.305    DEBUG   Finished Request    
15:20:01.618    FAIL    AttributeError: module 'base64' has no attribute 'encodestring' 
15:20:01.619    DEBUG   Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/SeleniumLibrary/__init__.py", line 490, in run_keyword
    return DynamicCore.run_keyword(self, name, args, kwargs)
  File "/usr/local/lib/python3.9/site-packages/robotlibcore.py", line 103, in run_keyword
    return self.keywords[name](*args, **(kwargs or {}))
  File "/usr/local/lib/python3.9/site-packages/SeleniumLibrary/keywords/formelement.py", line 224, in choose_file
    self.find_element(locator).send_keys(file_path)
  File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 475, in send_keys
    value = self._upload(local_file)
  File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 695, in _upload
    content = base64.encodestring(fp.getvalue())
 

Ответ №1:

На основе обратной трассировки вы обнаружили эту проблему:

Selenium 3 несовместим с Python 3.9
введите описание изображения здесь

Это исправление проблемы: предупреждение об устаревании base64.encodestring(). введите описание изображения здесь

Они не будут переносить это исправление:

Спасибо за проблему. Мы не будем выпускать другую версию 3, поскольку мы направляемся к завершению Selenium 4. Использование Selenium 4.0.0.a5 является заменой, поэтому должно работать так же. Не должно быть никаких критических изменений.

  1. Итак, вы можете обновить selenium до Selenium 4.0.0.a5 или
  2. Например, понизьте уровень Python до 3.7. Я полагаю, локально вы не запускаете 3.9.

Комментарии:

1. Да, спасибо! Вы были абсолютно правы. Я запускаю Python 3.8 локально, и я изменил версию в docker. Версия Selenium, которую я использую, — seleniumlibrary == 5.0.0b1, так как у меня возникли проблемы с импортом любой другой версии при переходе с py27 на py3

Ответ №2:

Мы также сталкивались с этой проблемой, но возврат к более старой версии Python был невозможен из-за несовместимости с другими библиотеками. Если вы окажетесь в том же месте, вы можете воссоздать псевдоним следующим образом:

 import base64
base64.encodestring = base64.encodebytes
 

В какой бы точке входа вы ни находились.