多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

Selenium+Python参数化:读取TXT文件

更新时间:2022-04-26 09:03:20 作者:多测师 浏览:94

  概述

  从Selenium模块化一文中,可以看出参数化的必要性,本文来介绍下读取外部txt文件的方法。

  如何打开文件

  打开文件有以下两个函数可以应用:

  1、open(file_name,access_mode)

  file_name:文件路径及名称;

  access_mode:访问方式,具体参数如下,,未提供参数,则默认为r:

  · r:表示读取;

  · w:表示写入;

  · a:表示添加;

  · +: 表示读写;

  · b:表示2进制访问;

  2、file函数

  file()内建函数它的功能等于open(),如下根据文档说明可知:

  >>> help(open)

  open(...)

  open(name[, mode[, buffering]]) -> file object

  Open a file using the file() type, returns a file object. This is the

  preferred way to open a file. See file.__doc__ for further information.(END)

  读取英文txt

  接下来介绍读取txt文件内容的方法,Python中提供了读取文件的几种方法,如下;

  · Read() 读取整个文件

  · Readlines()按行读取整个文件

  · Readeline()按行读取一行内容

  现在假设读取的txt文件存储的是用户登录名及密码的测试数据,内容如下:

  admin,admin

  guest,guest

  test,test

Selenium+Python参数化:读取TXT文件

  那么这种情况就比较适合用按行读取的方式来获取文件,如下示例:

  #coding:utf-8

  import codecs

  def str_reader_txt(address):

  fp=open(address,'r')

  users=[]

  pwds=[]

  lines=fp.readlines()

  for data in lines:

  name,pwd=data.split(',')

  name=name.strip(' \t\r\n')

  pwd=pwd.strip(' \t\r\n')

  users.append(name)

  pwds.append(pwd)

  print "user:%s(len(%d))" %(name,len(name))

  print "pwd:%s(len(%d))" %(pwd,len(pwd))

  return users,pwds

  fp.close()

  上述通过Readlines()按行读取txt文件内容,并且使用split()函数切割字符串,分别得到用户名和密码,需要注意的是读取出来的字符有最后面的回车符,所以需要strip函数进行过滤。

  读取中文txt

  但是实际测试过程中,也有可能需要输入中文的用户及密码,能否测试通过?修改测试文档txt的用户名为中文,内容如下:

  管理员,admin

  来宾,guest

  测试人员,test

  可以看出,上述的脚本,在进行中文处理时,遇到异常,中文字符显示乱码,下面提供两种解决方法:

  方法一

  #coding:utf-8

  import codecs

  def str_reader_txt(address):

  fp=open(address,'r')

  users=[]

  pwds=[]

  lines=fp.readlines()

  for data in lines:

  print type(data)

  data=data.decode("gb18030")#处理中文编码问题

  print type(data)

  name,pwd=data.split(',')

  name=name.strip(' \t\r\n')

  pwd=pwd.strip(' \t\r\n')

  users.append(name)

  pwds.append(pwd)

  print "user:%s(len(%d))" %(name,len(name))

  print "pwd:%s(len(%d))" %(pwd,len(pwd))

  return users,pwds

  fp.close()

  该方法是在分割内容之前,将代码进行decode("gb18030")后,即可正常显示。

  原因说明

  在python中提到unicode,一般指的是unicode对象,例如'哈哈'的unicode对象为 u'\u54c8\u54c8'

  而str,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。

  在上述脚本运行中,使用type(data)打印在decode前后的data的数据格式,如下:

  可以看出,内置的open()方法打开文件时,read()读取的是str格式的:

  · Read()读取时,如果参数是str(且内容中含有中文),读取后需要使用正确的编码格式进行decode(),转为unicode字符后,才可以正确显示。

  · write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。

  方法二(推荐)

  在文件打开时直接指定使用gb18030格式读取后,即可直接操作,另外,该方法对中文txt和英文txt的处理均适用

  #coding:utf-8

  import codecs

  def str_reader_txt(address):

  fp=codecs.open(address,'r',"gb18030")

  #fp=open(address,'r')

  users=[]

  pwds=[]

  lines=fp.readlines()

  for data in lines:

  name,pwd=data.split(',')

  name=name.strip(' \t\r\n')

  pwd=pwd.strip(' \t\r\n')

  users.append(name)

  pwds.append(pwd)

  print "user:%s(len(%d))" %(name,len(name))

  print "pwd:%s(len(%d))" %(pwd,len(pwd))

  return users,pwds

  fp.close()

  备注:Codecs.getreader也可以达到同样的效果,如下:

  #coding:utf-8

  import codecs

  def str_reader_txt_csv(address):

  f=file(address,'rb')

  users=[]

  pwds=[]

  csv=codecs.getreader('gb18030')(f) #Codecs.getreaderf方法

  for data in csv:

  name,pwd=data.split(',')

  name=name.strip(' \t\r\n')

  pwd=pwd.strip(' \t\r\n')

  users.append(name)

  pwds.append(pwd)

  return users,pwds

  f.close()

  原因说明

  模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。

  写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;

  如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。对内置的open()来说,这个方法比较不容易在编码上出现问题,推荐使用

  为何使用gb18030的编码格式

  在windows平台下,默认的文档保存方式为ANSI,在简体中文系统下,ANSI 编码代表 GB2312 编码。

  在txt保存时,修改保存格式为UTF-8时,可以使用UTF-8编码打开,但是其字符长度有差异,其原因如下:

  需要一提的是BOM(Byte Order Mark)。我们在储存文件时,文件使用的编码并没有保存,打开时则需要我们记住原先保存时使用的编码并使用这个编码打开,这样一来就产生了许多麻烦。

  那记事本打开文件时并没有让选编码?不妨先打开记事本再使用文件 -> 打开一个保存为UTF-8编码格式的txt文档看看

  UTF引入了BOM来表示自身编码,如果一开始读入的几个字节是其中之一,则代表接下来要读取的文字使用的编码是相应的编码:

  BOM_UTF8 '\xef\xbb\xbf'

  BOM_UTF16_LE '\xff\xfe'

  BOM_UTF16_BE '\xfe\xff'

  那针对UTF-8格式文件存在BOM的情况下,如何获取内容呢?Codec中有个方法codecs.BOM_UTF8可以去参考一下,此处不详细解释

  GB2312、GBK、GB18030的区别及联系

  这里给出参考链接,http://www.zhihu.com/question/19677619

  该文章描述的比较全面清晰,总结一下就是:

  · GBK完全兼容GB2312

  · GB 18030完全兼容GB 2312,基本兼容GBK,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个。

  GB 18030,全称:国家标准GB 18030-2005《信息技术中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版。

  中文处理流程总结

  处理中文数据时最好采用如下方式:

  1. Decode early(尽早decode, 将文件中的内容转化成unicode再进行下一步处理)

  2. Unicode everywhere (程序内部处理都用unicode)

  3. Encode late (最后encode回所需的encoding, 例如把最终结果写进结果文件)

  有几点要说明一下:

  * 所谓“正确的”编码,指得是指定编码和字符串本身的编码必须一致。这个其实并不那么容易判断,一般来说,我们直接输入的简体中文字符,有两种可能的编码:GB2312(GBK、GB18030)、以及UTF-8

  * GB2312、GBK、GB18030本质上是同一种编码标准。只是在前者基础上扩充了字符数量

  * UTF-8和GB编码不兼容

  *第二步,将str转化为unicode对象时,可以使用下列两个方法:都是将gb2312编码的str转为unicode编码

  · unicode(str,'gb2312')

  · str.decode('gb2312')

  *另外,在定义字符串时,出现中文,都使用str=u '汉字' 来定义。

  以上内容为大家介绍了自动化测试中的Selenium+Python参数化:读取TXT文件,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部