Ввод русских значений в input

Использую питон 2.7 запускаю такой код

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.google.com")
driver.implicitly_wait(60)
driver.find_element_by_name('q').send_keys('тест')

Но выдает ошибку:

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

Я так понимаю что проблема в том, пытаюсь записать русские буквы в строку поиска. Решение проблемы:

driver.find_element_by_name('q').send_keys('тест'.decode('utf-8'))

Но как то это не очень удобно и надо помнить какждый раз, когда хочешь вводить значения на русском. Нет ли другого решения это проблемы?

p.s.: Я так понимаю в 3.4 такой проблемы нет?

По самому Python’у не подскажу. Но вот с точки зрения структуры, следует избегать лобового обращения к драйверу и его API из теста. Если вы не поленитесь добавить немного абстракции, aka BasePage, то ваша проблема решится путем написания простой обертки над sendKeys, в которой собственно и сокроется декодирование входной строки:

driver.find_element_by_name(element).send_keys(text.decode('utf-8'))

где element, text - input параметры вашего метода. При этом, из пейджей / тестов вам уже не нужно будет задумываться о декодировании текста.

1 лайк

Да, конечно, в тесте все сделано через переменную. Это просто пример =)

В начало скрипта попробуйте добавить # -- coding: utf-8 --
мб поможет

1 лайк

Это помогает, что бы нормально файл читался, с русскими комментариями

В python 2.7 все символы по дефолту оперируются как ASCII, а не юникод. Соответственно в ASCII нет русских символов и для этого надо использовать юникод. Что это означает:

  1. Файл с исходным кодом должен быть сохранен как utf-8
  2. В начале файла должна быть нотация кодировки, которая используется # -*- coding: utf-8 -*-
  3. Все строковые переменные, которые выходят за таблицу ASCII должны быть представлены в как unicode с префиксом u'некоторый текст'

Вот переделанный пример, который будет работать:

#-*- coding: utf-8 -*-

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.google.com")
driver.implicitly_wait(60)
# русский комментарий
driver.find_element_by_name('q').send_keys(u'тест')

Ну и чтобы более точно разобраться со байт строками и уникодом, посмотрите пожалуйста вот эту презентацию http://farmdev.com/talks/unicode/

В версии 3.4. все строки - это уже юникод по дефолту, потому все должно работать.