Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to deal with strange chars in selenium? 'utf8' codec can't decode byte 0xc3 in position 0:

im trying to send keys with spanish accents in selenium, what im doing is sending strings via a array with various entrys, here is the line where it get stucks.

["Electrodomésticos", "Otros electrodomésticos", ["sensorhumo.jpg"], "Sensor de humo inalámbrico independiente.", "-Frecuencia: 433Mhz. -Codigo de trabajo: 2262. -Alacance inalámbrico: 80 mts con línea de vista. ", "59000", "x", "x", "x", "x", "x", "x"],

when i send this part:

"-Frecuencia: 433Mhz. -Codigo de trabajo: 2262. -Alacance inalámbrico: 80 mts con línea de vista. "

to this code:

    descripcion=".//*[@id='field-description']"
    descripciontext=str(array3[i][x])
    x=x+1
    descripcionelement = wait.until(lambda driver: driver.find_element_by_xpath(descripcion))
    descripcionelement.send_keys(descripciontext) 

it throws this message:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0: unexpected end of data

it only works if i remove the accents from this part and i tried using decode.

like image 444
2one2 Avatar asked Dec 11 '25 19:12

2one2


2 Answers

I've stumbled with this error myself, when I was trying to send something like 'España' in a select option inside a form.

The accepted answer is right, the best approach is to send values in unicode.

I'll leave here a short easy code, that transforms the value that is sent, either str or unicode, in a transparent way

def _convert(param):
    if isinstance(param, str):
        return param.decode('utf-8')
    else:
        return param

# both examples will work
parameter = 'España'
driver_element.send_keys(_convert(parameter)) 

unicode_parameter = u'España'
driver_element.send_keys(_convert(parameter))
like image 170
valeas Avatar answered Dec 13 '25 07:12

valeas


To handle unicode in selenium-sendkeys, unicode casting is needed, to convert bytes into unicode use one of the ways-

descripciontext = "-Frecuencia: 433Mhz. -Codigo de trabajo: 2262. -Alacance inalámbrico: 80 mts con línea de vista."

Unicode (by manual):     descripciontext = u"-Frecuencia: 433Mhz. -Codigo de trabajo: 2262. -Alacance inalámbrico: 80 mts con línea de vista."

Or

Unicode (by automatic decoding):     descripciontext = unicode(descripciontext.decode("iso-8859-4"))

Now use send_keys

descripcionelement.send_keys(descripciontext)
like image 30
SIslam Avatar answered Dec 13 '25 09:12

SIslam