我在断言两个非ascii值时遇到问题。一个来自csv文件,另一个来自html中的元素:
<h1 class="LoginElement">登录</h1>
我使用selenium来获取文本
w_msg = driver.find_element(By.CSS_SELECTOR, "h1.LoginElement").text
当我断言两个值时
assert txt in w_msg
我收到以下错误消息:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)
如果我打印变量及其类型:
print txt
print type(txt)
print w_msg
print type(w_msg)
返回以下内容:
登入
<type 'str'>
登录
<type 'unicode'>
这就是我从我的&#34;实用程序&#34;中初始化CSV文件的方法。类:
def open_csv(base_csv, file_name):
csv_file = open(base_csv + file_name, 'rb')
reader = csv.reader(csv_file, delimiter=',')
row = list(reader)
return row
以下是来自测试的电话:
csv = Utility.open_csv(base_csv, file_name)
注意:我使用OpenOffice Calc构建csv并将其保存为UTF-8
我已经尝试了很多在SO中找到的解决方案,但仍然无法使其发挥作用。任何帮助或领导正确的方向将非常感激。
答案 0 :(得分:2)
Python正在尝试将您的str
转换为Unicode以执行比较。不幸的是,Python 2.x被设计为谨慎,并且只使用ASCII解码您的字符串。
您需要使用CSV文件的相应编码将txt
解码为Unicode,因此Python不必这样做。
您可以使用txt.decode()
执行此操作,但最好的方法是在阅读文件时让Python为您解码。
不幸的是,Python 2.x CSV模块不支持Unicode,因此您需要使用drop in replacement:https://github.com/jdunck/python-unicodecsv
使用它像:
import unicodecsv
with open("myfile.csv") as my_csv:
r = unicodecsv.reader(my_csv, encoding=YOURENCODING)
YOURENCODING
可能是utf-8
,cp1252
或此处列出的任何编解码器:https://docs.python.org/2/library/codecs.html#standard-encodings
如果CSV来自Excel,则它可能是以cp
开头的编解码器