#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 является заменой, поэтому должно работать так же. Не должно быть никаких критических изменений.
- Итак, вы можете обновить selenium до Selenium 4.0.0.a5 или
- Например, понизьте уровень 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
В какой бы точке входа вы ни находились.