Search code examples
pythondockeruploadbase64robotframework

Robotframework "Choose file" causes AttributeError: module 'base64' has no attribute 'encodestring' in docker


I'm trying to run a test in a docker container, which runs locally with no issues: I want to upload a correct.csv file from 'correct' directory

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

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

But when running test in docker I get a FAIL with the AttributeError: module 'base64' has no attribute 'encodestring'. Is it because there is no GUI in docker? or the encoding needs to be fixed? Or eventually maybe there is another solution I can use for uploading files?

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())

Solution

  • Based on the traceback you have found this issue:

    Selenium 3 is incompatible with Python 3.9 enter image description here

    This is the fix for the issue: DeprecationWarning of base64.encodestring(). enter image description here

    They won't back port this fix:

    Thanks for the issue. We won't be releasing another version 3 as we're heading to finishing off Selenium 4. It is a drop in replacement to use Selenium 4.0.0.a5 so should work the same. There should not be any breaking changes.

    1. So you could upgrade selenium to Selenium 4.0.0.a5 or
    2. Downgrade Python to 3.7 for example. I suppose locally you do not run 3.9.