Selenium Python 2.7 - 断言非ascii字符

时间:2016-08-23 15:18:14

标签: python unicode pytest

我在断言两个非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中找到的解决方案,但仍然无法使其发挥作用。任何帮助或领导正确的方向将非常感激。

1 个答案:

答案 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-8cp1252或此处列出的任何编解码器:https://docs.python.org/2/library/codecs.html#standard-encodings

如果CSV来自Excel,则它可能是以cp开头的编解码器