excel文件之数据处理-python/ExcelLibrary

兵临咸阳 发表了文章 • 3 个评论 • 566 次浏览 • 2018-06-26 15:37 • 来自相关话题

 
前几天,收到老板的一个需求,需要把从数据库导出来的excel文件中“审核未通过原因”这一列作一个统计,统计未通过原因出现的次数,因为数据量比较庞大,我就想着能否用robot框架去做,网上一搜,果然有这个库:ExcelLibrary,这个库支持对excel文件进行处理。

首先,引入ExcelLibrary库,操作Excel文件

安装命令 pip install robotframework-excellibrary

安装导入完成之后,我用f5命令大概看了一下常用的一些关键字:

Open Excel 打开Excel文件

Get Row Count 获取行数

Get Column Count 获取列数

Get Row Values 获取某一行的值

Get Column Values 获取某一列的值

Read Cell Data By Coordinates 通过列行编号获取值

Read Cell Data By Name 按名称读取单元格数据

也看了一下这个library的官方文档,有一些注意事项:

1.只支持xls格式的Excel文档

2.Excel表格中的数值,代码读取后会显示为浮点型

如123,读取后显示为123.00,造成传参不一致

解决方案:设置单元格格式---->文本

3.读取每行或每列数据,存储到list变量中,是一个二维数组

如(A1,123)(B1,张三)

4.数组的位置编号都是从0开始的

好啦,现在我们开始来完成,老板提的需求了

首先我们要打开这个excel文件,并获取这一列的信息:






获取获取列信息后,我们看到,我们获取到的信息是一个二维数组,它不仅包含了我们需要的信息,还包含了我们不需要的坐标信息,这样就加大了我们统计的难度。






那么,接下来我们要做的,就是把二维数组转变为一维数组,框架库里面没有合适的关键字,这时我们用强大的Evaluate关键字,这是一个内置的关键字,为什么说它很强大呢?当框架里面没有合适封装的关键字时,我们可以用这个关键字执行python底层代码并返回结果:






结果如下:






这样,二维数组就变成了一维数组,接下来,我们就要统计这个数组里面相同元素,以字典dict形式返回元素和数量

这个地方由于没有合适的关键字,我自定义了一个函数,来统计数组里面相同元素的个数
















这样就大功告成啦!!!

当然,这个库还有很多其他的功能,比如说将获取到的数据,存入到excel文件并保存等等,这些功能在以后慢慢探索吧!
 
PS:本文原创发布于微信公众号「brucepk」,欢迎推荐关注





  查看全部
1.jpg

 
前几天,收到老板的一个需求,需要把从数据库导出来的excel文件中“审核未通过原因”这一列作一个统计,统计未通过原因出现的次数,因为数据量比较庞大,我就想着能否用robot框架去做,网上一搜,果然有这个库:ExcelLibrary,这个库支持对excel文件进行处理。

首先,引入ExcelLibrary库,操作Excel文件

安装命令 pip install robotframework-excellibrary

安装导入完成之后,我用f5命令大概看了一下常用的一些关键字:

Open Excel 打开Excel文件

Get Row Count 获取行数

Get Column Count 获取列数

Get Row Values 获取某一行的值

Get Column Values 获取某一列的值

Read Cell Data By Coordinates 通过列行编号获取值

Read Cell Data By Name 按名称读取单元格数据

也看了一下这个library的官方文档,有一些注意事项:

1.只支持xls格式的Excel文档

2.Excel表格中的数值,代码读取后会显示为浮点型

如123,读取后显示为123.00,造成传参不一致

解决方案:设置单元格格式---->文本

3.读取每行或每列数据,存储到list变量中,是一个二维数组

如(A1,123)(B1,张三)

4.数组的位置编号都是从0开始的

好啦,现在我们开始来完成,老板提的需求了

首先我们要打开这个excel文件,并获取这一列的信息:

2.png


获取获取列信息后,我们看到,我们获取到的信息是一个二维数组,它不仅包含了我们需要的信息,还包含了我们不需要的坐标信息,这样就加大了我们统计的难度。

二维数组.png


那么,接下来我们要做的,就是把二维数组转变为一维数组,框架库里面没有合适的关键字,这时我们用强大的Evaluate关键字,这是一个内置的关键字,为什么说它很强大呢?当框架里面没有合适封装的关键字时,我们可以用这个关键字执行python底层代码并返回结果:

3.png


结果如下:

4.png


这样,二维数组就变成了一维数组,接下来,我们就要统计这个数组里面相同元素,以字典dict形式返回元素和数量

这个地方由于没有合适的关键字,我自定义了一个函数,来统计数组里面相同元素的个数

5.png


6.png


7.png


这样就大功告成啦!!!

当然,这个库还有很多其他的功能,比如说将获取到的数据,存入到excel文件并保存等等,这些功能在以后慢慢探索吧!
 
PS:本文原创发布于微信公众号「brucepk」,欢迎推荐关注

code.jpg

 

Robot Framework编码详解-解决乱码问题

兵临咸阳 发表了文章 • 1 个评论 • 467 次浏览 • 2018-06-25 13:47 • 来自相关话题

今天给大家讲下robotframework框架中unicode编码或者是问号乱码的问题
大家看下面这个小栗子











这就涉及到了计算机的编码问题
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。

由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。
字母A用ASCII编码是十进制的65,二进制的01000001;
字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的;

汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:
UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器。
所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码。

弄清楚了这个编码问题之后,我们再来看一下如何解决robotframework框架unicode的问题
首先,看下我的安装环境,我的robotframework版本是3.0.x的





找到robotframework安装目录下的unic.py文件,我的目录是C:\Python27\Lib\site-packages\robotframework-3.0.4-py2.7.egg\robot\utils,在unic.py文件中插入
if isinstance(item, (list, dict, tuple)):
    try:
        item = json.dumps(item, ensure_ascii=False, encoding='utf-8')
    except UnicodeDecodeError:
        try:
                item = json.dumps(item, ensure_ascii=False, encoding='utf-8')
        except:
            pass
        except:
            pass







加完这一段代码之后,保存,然后重启ride编辑器,再运行一下刚才的脚本,现实中文正常了!







如果你的还是显示不正常,请继续往下看,我们来看一下是不是python默认的编码方式导致的
cmd命令下通过以下命令查看python默认的编码
python
import sys
sys.getdefaultencoding()






这时看到,python的默认编码方式是ascii编码方式,这时我们将它改成utf8
在Python的Lib\site-packages文件夹下新建一个sitecustomize.py文件,内容为:
#coding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
重启Python解释器,发现编码已被设置为utf8






这样,乱码问题就完美解决!

 PS:本文原创发布于微信公众号「brucepk」,欢迎推荐关注。





  查看全部
1.jpg


今天给大家讲下robotframework框架中unicode编码或者是问号乱码的问题
大家看下面这个小栗子


2.png


3.png


这就涉及到了计算机的编码问题
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。


由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。


你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。


现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。
字母A用ASCII编码是十进制的65,二进制的01000001;
字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的;


汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。


新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:
UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。


搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。


浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器。
所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码。


弄清楚了这个编码问题之后,我们再来看一下如何解决robotframework框架unicode的问题
首先,看下我的安装环境,我的robotframework版本是3.0.x的

4.png


找到robotframework安装目录下的unic.py文件,我的目录是C:\Python27\Lib\site-packages\robotframework-3.0.4-py2.7.egg\robot\utils,在unic.py文件中插入
if isinstance(item, (list, dict, tuple)):
    try:
        item = json.dumps(item, ensure_ascii=False, encoding='utf-8')
    except UnicodeDecodeError:
        try:
                item = json.dumps(item, ensure_ascii=False, encoding='utf-8')
        except:
            pass
        except:
            pass


5.png



加完这一段代码之后,保存,然后重启ride编辑器,再运行一下刚才的脚本,现实中文正常了!

6.png



如果你的还是显示不正常,请继续往下看,我们来看一下是不是python默认的编码方式导致的
cmd命令下通过以下命令查看python默认的编码
python
import sys
sys.getdefaultencoding()


7.png


这时看到,python的默认编码方式是ascii编码方式,这时我们将它改成utf8
在Python的Lib\site-packages文件夹下新建一个sitecustomize.py文件,内容为:
#coding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
重启Python解释器,发现编码已被设置为utf8


8.png


这样,乱码问题就完美解决!

 PS:本文原创发布于微信公众号「brucepk」,欢迎推荐关注。

code.jpg

 

Robot Framework+Oracle数据库操作

兵临咸阳 发表了文章 • 2 个评论 • 264 次浏览 • 2018-06-25 13:41 • 来自相关话题

 

 
今天给大家带来一篇Robot Framework+Oracle数据库操作和一些常见问题的解决方案
 
1,基本环境
首先,robotframework环境+DatabaseLibrary环境准备好
robotframework的环境就不再啰嗦啦,不懂安装的可以翻看我前面发的文章,DatabaseLibrary环境直接使用pip命令安装:
pip install robotframework-databaselibrary==0.6
 
2.安装支持
如果是测试Oracle的话,需要安装一个支持库是cx_Oracle。本文就以oracle数据库为例,来给大家讲解。
 
下载地址:链接:https://pan.baidu.com/s/1y8SovhMeTwo2-QdBby1gUQ 密码:9hy0
 
我下载的文件名字是:cx_Oracle-5.1.3-11g.win-amd64-py2.7
我给大家分析一下这个文件名称的含义:
11g:表示这个安装包支持oracle的版本是11;
win-amd64:表示安装的版本是64位,这个版本是和python的版本一致,注意,不是和windows电脑的版本一致;
py2.7:这个表示此安装包支持python2.7版本
 
3.dll文件安装
用robotframework操作oracle数据库,不需要安装oracle数据库,当然,安装了也没关系,安装了的话也不用卸载,我们只要确保,放在site-packages目录下的dll文件是正确的就行;
电脑上没有安装oracle需要下载相关的dll文件,直接下载
instant-client即可,如果你的path版本也是64位的话,可以用我下面这个包 链接:https://pan.baidu.com/s/1atdiFob7BA30uaMKZYJAbg 密码:hmup
如果版本不对的话,也可以自己去oracle官网进行下载,解压;
解压完成后,在里面找oci.dll、oraocci11.dll、oraociei11.dll这三个文件,把这三个文件复制到python安装目录的site-packages下,我的安装目录是:C:\Python27\Lib\site-packages
 
4.在ride里导入DatabaseLibrary





 
 
 
5.数据库操作
DatabaseLibrary显示为黑色就表示导入成功了,接下来就可以用这个框架来操作数据库了 





 
 
解释一下这一段脚本:
1.首先用关键字:Connect To Database Using Custom Params
后面要带第一个的参数是刚才安装过的cx_Oracle,第二个参数是连接数据库的基本信息,包括用户名,密码,端口,和数据库名称,基本的格式为:‘user’, ‘password’, ‘host:port/dbname’
2.用关键字Query来接收查询语句,并返回给@{a},log many将它打印出来
3.记得养成好习惯,查完后用户Disconnect from Database这个关键字来断开数据库连接
 
来看一下效果:
 

 
 
 
这样就通过一个sql,把我想要的信息都查出来了,查出来之后可以输入到某些输入框里面吗?当然可以,比如说我们要把第一行,第一列的数值取出来,可以这样操作:
直接在,@{a}下面加一行${b}     decode    @{a[0][0]}





 
下面在用input text这个关键字,参数输入输入框的locator和${b}即可。
有些时候查出来的数据,是unicode编码或者是问号乱码,关于乱码问题,下一篇文章以一个专题给大家分析讲解一下。
 
PS:本文原创发布于微信公众号「brucepk」,欢迎推荐关注。





  查看全部
 

 
今天给大家带来一篇Robot Framework+Oracle数据库操作和一些常见问题的解决方案
 
1,基本环境
首先,robotframework环境+DatabaseLibrary环境准备好
robotframework的环境就不再啰嗦啦,不懂安装的可以翻看我前面发的文章,DatabaseLibrary环境直接使用pip命令安装:
pip install robotframework-databaselibrary==0.6
 
2.安装支持
如果是测试Oracle的话,需要安装一个支持库是cx_Oracle。本文就以oracle数据库为例,来给大家讲解。
 
下载地址:链接:https://pan.baidu.com/s/1y8SovhMeTwo2-QdBby1gUQ 密码:9hy0
 
我下载的文件名字是:cx_Oracle-5.1.3-11g.win-amd64-py2.7
我给大家分析一下这个文件名称的含义:
11g:表示这个安装包支持oracle的版本是11;
win-amd64:表示安装的版本是64位,这个版本是和python的版本一致,注意,不是和windows电脑的版本一致;
py2.7:这个表示此安装包支持python2.7版本
 
3.dll文件安装
用robotframework操作oracle数据库,不需要安装oracle数据库,当然,安装了也没关系,安装了的话也不用卸载,我们只要确保,放在site-packages目录下的dll文件是正确的就行;
电脑上没有安装oracle需要下载相关的dll文件,直接下载
instant-client即可,如果你的path版本也是64位的话,可以用我下面这个包 链接:https://pan.baidu.com/s/1atdiFob7BA30uaMKZYJAbg 密码:hmup
如果版本不对的话,也可以自己去oracle官网进行下载,解压;
解压完成后,在里面找oci.dll、oraocci11.dll、oraociei11.dll这三个文件,把这三个文件复制到python安装目录的site-packages下,我的安装目录是:C:\Python27\Lib\site-packages
 
4.在ride里导入DatabaseLibrary

导入包.jpg

 
 
 
5.数据库操作
DatabaseLibrary显示为黑色就表示导入成功了,接下来就可以用这个框架来操作数据库了 

数据库.png

 
 
解释一下这一段脚本:
1.首先用关键字:Connect To Database Using Custom Params
后面要带第一个的参数是刚才安装过的cx_Oracle,第二个参数是连接数据库的基本信息,包括用户名,密码,端口,和数据库名称,基本的格式为:‘user’, ‘password’, ‘host:port/dbname’
2.用关键字Query来接收查询语句,并返回给@{a},log many将它打印出来
3.记得养成好习惯,查完后用户Disconnect from Database这个关键字来断开数据库连接
 
来看一下效果:
 

 
 
 
这样就通过一个sql,把我想要的信息都查出来了,查出来之后可以输入到某些输入框里面吗?当然可以,比如说我们要把第一行,第一列的数值取出来,可以这样操作:
直接在,@{a}下面加一行${b}     decode    @{a[0][0]}

数据库.png

 
下面在用input text这个关键字,参数输入输入框的locator和${b}即可。
有些时候查出来的数据,是unicode编码或者是问号乱码,关于乱码问题,下一篇文章以一个专题给大家分析讲解一下。
 
PS:本文原创发布于微信公众号「brucepk」,欢迎推荐关注。

code.jpg

 

好用的Robotframework官方支持python3.0的IDE工具~~RED~了解一下

my11 发表了文章 • 9 个评论 • 1860 次浏览 • 2018-04-18 13:32 • 来自相关话题

本来以为大家都知道这个了,也没想着写文章,前阵子发现有人在问RIDE不支持3.0怎么办,今天又看到有人在问有什么好用的调试RF脚本的工具。
原来还这么多人都不知道官方的这个工具的?
所以想来介绍一下这个东东。
http://nokia.github.io/RED/ 
上面是官方网站,可以看到也是nokia官方出的,然后RED其实是基于eclipse的一个插件,不过也不用特别去下载eclipse,在官方下了RED直接就能用的,很方便。
用法嘛,用过eclipse的同学都知道……没用过的,按照官方教程走也不难。
啥,你说看不懂英文?谷歌翻译、百度翻译,随便选吧~~
 
贴几张官方的图,直观感受一下界面~

 

可以点击Test Cases一键切换到表格形式,不过个人觉得表格方式不是很方便用,所以一般都停留在Source界面。

 

调试debug上传git等等什么的都很方便,毕竟是eclipse的插件嘛~~ 爱咋用咋用~
好了,希望各位使用的愉快~~~
反正真的不愿意看官方英文文档的话,搜搜也有别人博客发了这玩意怎么用的(虽然我觉得看官方文档是最简单直接不走弯路的方式啦)
 
【重要】凡是提问的,贴一大堆报错代码的,或者说这个不会用那个不会用的,请老老实实去阅读官方文档,别碰上个屁大点问题就上来求助……抱歉本人没那么多时间,谢谢! 查看全部
本来以为大家都知道这个了,也没想着写文章,前阵子发现有人在问RIDE不支持3.0怎么办,今天又看到有人在问有什么好用的调试RF脚本的工具。
原来还这么多人都不知道官方的这个工具的?
所以想来介绍一下这个东东。
http://nokia.github.io/RED/ 
上面是官方网站,可以看到也是nokia官方出的,然后RED其实是基于eclipse的一个插件,不过也不用特别去下载eclipse,在官方下了RED直接就能用的,很方便。
用法嘛,用过eclipse的同学都知道……没用过的,按照官方教程走也不难。
啥,你说看不懂英文?谷歌翻译、百度翻译,随便选吧~~
 
贴几张官方的图,直观感受一下界面~

 

可以点击Test Cases一键切换到表格形式,不过个人觉得表格方式不是很方便用,所以一般都停留在Source界面。

 

调试debug上传git等等什么的都很方便,毕竟是eclipse的插件嘛~~ 爱咋用咋用~
好了,希望各位使用的愉快~~~
反正真的不愿意看官方英文文档的话,搜搜也有别人博客发了这玩意怎么用的(虽然我觉得看官方文档是最简单直接不走弯路的方式啦)
 
【重要】凡是提问的,贴一大堆报错代码的,或者说这个不会用那个不会用的,请老老实实去阅读官方文档,别碰上个屁大点问题就上来求助……抱歉本人没那么多时间,谢谢!

robot framework 2.7 安装顺序

liuty1 发表了文章 • 2 个评论 • 365 次浏览 • 2018-03-28 10:45 • 来自相关话题

个人安装这个环境也遇到一些坑,本人是64位,具体请见附件
个人安装这个环境也遇到一些坑,本人是64位,具体请见附件

win10系统,手动添加关键字(函数)在python 的_element.py里,RF调用此关键字失败

回复

chanchanj 回复了问题 • 1 人关注 • 1 个回复 • 486 次浏览 • 2018-03-21 11:47 • 来自相关话题

CSS定位含有JS判断的文本框,CSS选择器copy selector定位元素失败

chanchanj 发表了文章 • 0 个评论 • 755 次浏览 • 2018-02-27 18:16 • 来自相关话题

情况说明:文本输入框cun存在JS判断,文本框处于输入状态时,会在div里写入新的class,使用鼠标右键点击检查定位出来的css元素含有偏差,导致无法定位
解决办法:定位非输入状态的文本框
 
非输入状态时的代码
<iv class="el-form-item is-required">
::before
<label for="dpName" class="el-form-item__label" style="width: 140px;"
 
输入状态时的代码
<iv class="el-form-item is-error is-required">
::before
<label for="dpName" class="el-form-item__label" style="width: 140px;"
  查看全部
情况说明:文本输入框cun存在JS判断,文本框处于输入状态时,会在div里写入新的class,使用鼠标右键点击检查定位出来的css元素含有偏差,导致无法定位
解决办法:定位非输入状态的文本框
 
非输入状态时的代码
<iv class="el-form-item is-required">
::before
<label for="dpName" class="el-form-item__label" style="width: 140px;"
 
输入状态时的代码
<iv class="el-form-item is-error is-required">
::before
<label for="dpName" class="el-form-item__label" style="width: 140px;"
 

怎么定位页面中嵌入页面中的元素

xyh421 回复了问题 • 2 人关注 • 1 个回复 • 538 次浏览 • 2018-01-27 14:59 • 来自相关话题

Create Webdriver之Chrome,Firefox使用Headless模式进行测试

Hurts 发表了文章 • 9 个评论 • 1535 次浏览 • 2018-01-03 12:01 • 来自相关话题

Headless模式就是Without any of the UI components visible,指的是在自动化调用浏览器的过程中,浏览器在后台运行,不会有窗口显示出来,其实对日常调试或者一些测试来说还是挺实用的。
 
Chrome要求版本:Win 60+、Mac和Linux 59+${options}= Evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys, selenium.webdriver
Call Method ${options} add_argument --headless
Create WebDriver Chrome chrome_options=${options}




Firefox要求版本:Linux 55+、Win和Mac 56+${options}= Evaluate sys.modules['selenium.webdriver'].FirefoxOptions() sys, selenium.webdriver
Call Method ${options} add_argument -headless
Create WebDriver Firefox firefox_options=${options}




在使用中或许会碰到一些问题,一般加上Set Window Size这个关键字,设置一下窗口大小可以解决问题。 查看全部
Headless模式就是Without any of the UI components visible,指的是在自动化调用浏览器的过程中,浏览器在后台运行,不会有窗口显示出来,其实对日常调试或者一些测试来说还是挺实用的。
 
Chrome要求版本:Win 60+、Mac和Linux 59+
${options}=    Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
Call Method ${options} add_argument --headless
Create WebDriver Chrome chrome_options=${options}




Firefox要求版本:Linux 55+、Win和Mac 56+
${options}=    Evaluate    sys.modules['selenium.webdriver'].FirefoxOptions()    sys, selenium.webdriver
Call Method ${options} add_argument -headless
Create WebDriver Firefox firefox_options=${options}




在使用中或许会碰到一些问题,一般加上Set Window Size这个关键字,设置一下窗口大小可以解决问题。

Create Webdriver之给Chrome,Firefox设置代理

Hurts 发表了文章 • 1 个评论 • 1366 次浏览 • 2018-01-02 17:32 • 来自相关话题

以前的办法都是通过Extension来指定代理,然后在脚本中指定用户文件,这样就可以在测试中使用代理了。
 
可是由于环境越来越多,这样便显得不实用了。
 
所以就研究了一下,怎么通过纯脚本实现代理的使用。
 
Chrome(应该各个版本都通用):${options}= Evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys, selenium.webdriver
Call Method ${options} add_argument --proxy-server\=192.168.2.60:1088
Create Webdriver Chrome chrome_options=${options}我这里用的是Socks协议的代理,Http协议也可以通用,带账号密码的没有试过,可以自己去研究一下。
 
Firefox(我自己分了Selenium 2.x 和 Selenium 3.x):
 
Selenium 2.x${proxy}= Evaluate sys.modules['selenium.webdriver'].Proxy() sys, selenium.webdriver
${proxy.http_proxy}= Set Variable 192.168.2.60:1088
${proxy.socks_proxy}= Set Variable 192.168.2.60:1088
${proxy.ftp_proxy}= Set Variable 192.168.2.60:1088
${proxy.ssl_proxy}= Set Variable 192.168.2.60:1088
${proxy.no_proxy}= Set Variable localhost, 127.0.0.1
Create Webdriver Firefox proxy=${proxy}
Selenium 3.x 的代理使用需要指定ProxyType,Type有(AUTODETECT【4】 、DIRECT【0】,MANUAL【1】、PAC【2】、RESERVED_1【3】、SYSTEM【5】、 UNSPECIFIED【6】)这些,其中的数字是该Type对应的ff_value,可以通过这个值指定某一个Type。 ${profile}= Evaluate sys.modules['selenium.webdriver'].FirefoxProfile() sys, selenium.webdriver
Call Method ${profile} set_preference network.proxy.socks 192.168.2.60
Call Method ${profile} set_preference network.proxy.socks_port ${1088}
Call Method ${profile} set_preference network.proxy.http 192.168.2.60
Call Method ${profile} set_preference network.proxy.http_port ${1088}
Call Method ${profile} set_preference network.proxy.ftp 192.168.2.60
Call Method ${profile} set_preference network.proxy.ftp_port ${1088}
Call Method ${profile} set_preference network.proxy.ssl 192.168.2.60
Call Method ${profile} set_preference network.proxy.ssl_port ${1088}
Call Method ${profile} set_preference network.proxy.no_proxy localhost, 127.0.0.1
Call Method ${profile} set_preference network.proxy.type ${1}
Create WebDriver Firefox firefox_profile=${profile} 方法不止这一种,可以自己去看Selenium的官方文档,里面也有如何使用带账号密码的代理的方法。
  查看全部
以前的办法都是通过Extension来指定代理,然后在脚本中指定用户文件,这样就可以在测试中使用代理了。
 
可是由于环境越来越多,这样便显得不实用了。
 
所以就研究了一下,怎么通过纯脚本实现代理的使用。
 
Chrome(应该各个版本都通用):
${options}=	Evaluate	sys.modules['selenium.webdriver'].ChromeOptions()	sys, selenium.webdriver
Call Method ${options} add_argument --proxy-server\=192.168.2.60:1088
Create Webdriver Chrome chrome_options=${options}
我这里用的是Socks协议的代理,Http协议也可以通用,带账号密码的没有试过,可以自己去研究一下。
 
Firefox(我自己分了Selenium 2.x 和 Selenium 3.x):
 
Selenium 2.x
${proxy}=	Evaluate	sys.modules['selenium.webdriver'].Proxy()	sys, selenium.webdriver
${proxy.http_proxy}= Set Variable 192.168.2.60:1088
${proxy.socks_proxy}= Set Variable 192.168.2.60:1088
${proxy.ftp_proxy}= Set Variable 192.168.2.60:1088
${proxy.ssl_proxy}= Set Variable 192.168.2.60:1088
${proxy.no_proxy}= Set Variable localhost, 127.0.0.1
Create Webdriver Firefox proxy=${proxy}

Selenium 3.x 的代理使用需要指定ProxyType,Type有(AUTODETECT【4】 、DIRECT【0】,MANUAL【1】、PAC【2】、RESERVED_1【3】、SYSTEM【5】、 UNSPECIFIED【6】)这些,其中的数字是该Type对应的ff_value,可以通过这个值指定某一个Type。 
${profile}=	Evaluate	sys.modules['selenium.webdriver'].FirefoxProfile()	sys, selenium.webdriver	
Call Method ${profile} set_preference network.proxy.socks 192.168.2.60
Call Method ${profile} set_preference network.proxy.socks_port ${1088}
Call Method ${profile} set_preference network.proxy.http 192.168.2.60
Call Method ${profile} set_preference network.proxy.http_port ${1088}
Call Method ${profile} set_preference network.proxy.ftp 192.168.2.60
Call Method ${profile} set_preference network.proxy.ftp_port ${1088}
Call Method ${profile} set_preference network.proxy.ssl 192.168.2.60
Call Method ${profile} set_preference network.proxy.ssl_port ${1088}
Call Method ${profile} set_preference network.proxy.no_proxy localhost, 127.0.0.1
Call Method ${profile} set_preference network.proxy.type ${1}
Create WebDriver Firefox firefox_profile=${profile}
方法不止这一种,可以自己去看Selenium的官方文档,里面也有如何使用带账号密码的代理的方法。