为什么第二个接口不反悔数据

回复

qianyoujia 发起了问题 • 1 人关注 • 0 个回复 • 68 次浏览 • 2019-01-28 16:06 • 来自相关话题

苹果系统安装wxpython2.8版本不成功,网上的教程都试过了,求大佬解惑

回复

xjzm 发起了问题 • 1 人关注 • 0 个回复 • 88 次浏览 • 2019-01-17 11:43 • 来自相关话题

appium android app 用户登录时输入密码 没动静或者值错误,输入中文异常的解决方法!

fdffd58 回复了问题 • 2 人关注 • 4 个回复 • 3595 次浏览 • 2018-08-01 23:36 • 来自相关话题

图形验证码-AI人工智能初步探索

兵临咸阳 发表了文章 • 0 个评论 • 493 次浏览 • 2018-06-28 17:10 • 来自相关话题

处于安全考虑,大部分的网站登录页面都会有验证码,验证码的有简单也有复杂的;
以下是度娘对验证码识别的介绍
验证码的主要目的是强制人机交互来抵御机器自动化攻击的。大部分的验证码设计者并不得要领,不了解图像处理,机器视觉,模式识别,人工智能的基本概念。
看来,验证码识别涉及到人工智能,这篇文章,通过验证码识别,对人工智能进行一个初探。
python robot框架有图像处理库PIL、pytesser、tesseract
环境搭建
1.pillow命令安装
pip install Pillow
用pip命令安装不了的话,也可以去官网下载whl包进行安装
https://pypi.org/project/Pillow/
安装完毕,需要检查一下安装是否成功。
如下图所示,打开python后,输入import Image,会提示没有这个模块。因为使用pillow库需要使用from PIL import Image代替import Image。按照图中的处理,即可验证PIL是否安装成功。






2.pytesser的使用
pytesser下载地址:链接:https://pan.baidu.com/s/1zBipW08DoT_WT-ubtIj7gw 密码:zedi
下载解压后直接放C:\Python27\Lib\site-packages(根据你安装的Python路径而不同),同时,新建一个pytesser.pth,内容就写pytesser,注意这里的内容一定要和pytesser这个文件夹同名,意思就是pytesser文件夹,pytesser.pth,及内容都要一样!







接下来打开pytesser文件夹,将pytesser.py修改成__init__.py,然后打开py文件进行修改:
1. import Image —> from PIL import Image
2. tesseract_exe_name = 'tesseract' —> tesseract_exe_name = 'Python安装路径\\Lib\\site-packges\\pytesser\\tesseract,注意双斜杠,否则可能因为转义字符报错







pytesser同时依赖tesseract-ocr,继续安装tesseract-ocr了,下载地址:链接:https://pan.baidu.com/s/1sbt4yt3y1LuPIxQVVug0AA 密码:2cb5
下载后解压,tessdata文件夹,用其替换掉pytesser解压后的tessdata文件夹即可。
3.进行实验






可以识别简单的验证码
复杂的呢?下图本来是有背景的,去除背景后识别率并非100%






有干扰线的根本无法识别






于是,不服气的我就做了一下尝试
1.收集验证码原材料






2.去除原图片噪点、将背景色处理成白色






3.将去噪点后的图片切割并人为打标签分库






然而。成功率并不高,因为干扰线的原因,数字形状不固定。
所有如果能去除干扰线,成功率就会提升一大截。
现在我还是个菜鸟,代码基础不太好,暂时无法解决,现在的方案是让开发在代码中加万能验证码。
人工智能图像识别,暂时就告一段落了,以后有新的进展会及时更新。
 
文章首发于公众号「brucepk」,欢迎直接去公众号看,定期分享自动化和python干货






  查看全部
1.jpeg

处于安全考虑,大部分的网站登录页面都会有验证码,验证码的有简单也有复杂的;
以下是度娘对验证码识别的介绍
验证码的主要目的是强制人机交互来抵御机器自动化攻击的。大部分的验证码设计者并不得要领,不了解图像处理,机器视觉,模式识别,人工智能的基本概念。
看来,验证码识别涉及到人工智能,这篇文章,通过验证码识别,对人工智能进行一个初探。
python robot框架有图像处理库PIL、pytesser、tesseract
环境搭建
1.pillow命令安装
pip install Pillow
用pip命令安装不了的话,也可以去官网下载whl包进行安装
https://pypi.org/project/Pillow/
安装完毕,需要检查一下安装是否成功。
如下图所示,打开python后,输入import Image,会提示没有这个模块。因为使用pillow库需要使用from PIL import Image代替import Image。按照图中的处理,即可验证PIL是否安装成功。

2.png


2.pytesser的使用
pytesser下载地址:链接:https://pan.baidu.com/s/1zBipW08DoT_WT-ubtIj7gw 密码:zedi
下载解压后直接放C:\Python27\Lib\site-packages(根据你安装的Python路径而不同),同时,新建一个pytesser.pth,内容就写pytesser,注意这里的内容一定要和pytesser这个文件夹同名,意思就是pytesser文件夹,pytesser.pth,及内容都要一样!

3.png



接下来打开pytesser文件夹,将pytesser.py修改成__init__.py,然后打开py文件进行修改:
1. import Image —> from PIL import Image
2. tesseract_exe_name = 'tesseract' —> tesseract_exe_name = 'Python安装路径\\Lib\\site-packges\\pytesser\\tesseract,注意双斜杠,否则可能因为转义字符报错

4.png



pytesser同时依赖tesseract-ocr,继续安装tesseract-ocr了,下载地址:链接:https://pan.baidu.com/s/1sbt4yt3y1LuPIxQVVug0AA 密码:2cb5
下载后解压,tessdata文件夹,用其替换掉pytesser解压后的tessdata文件夹即可。
3.进行实验

5.png


可以识别简单的验证码
复杂的呢?下图本来是有背景的,去除背景后识别率并非100%

6.png


有干扰线的根本无法识别

7.png


于是,不服气的我就做了一下尝试
1.收集验证码原材料

8.png


2.去除原图片噪点、将背景色处理成白色

9.png


3.将去噪点后的图片切割并人为打标签分库

10.png


然而。成功率并不高,因为干扰线的原因,数字形状不固定。
所有如果能去除干扰线,成功率就会提升一大截。
现在我还是个菜鸟,代码基础不太好,暂时无法解决,现在的方案是让开发在代码中加万能验证码。
人工智能图像识别,暂时就告一段落了,以后有新的进展会及时更新。
 
文章首发于公众号「brucepk」,欢迎直接去公众号看,定期分享自动化和python干货

11.jpg


 

robotframework成功运行case后,点击关闭按钮-无法关闭并提示SENDING

回复

雪花下的芬芳 回复了问题 • 1 人关注 • 1 个回复 • 480 次浏览 • 2018-04-26 17:35 • 来自相关话题

各位大神求推荐RF相关视频呢

虾虾吃泥巴 回复了问题 • 2 人关注 • 2 个回复 • 691 次浏览 • 2018-03-01 13:26 • 来自相关话题

robotframework 接口测试 +RSA 加密

学习真 发表了文章 • 4 个评论 • 1494 次浏览 • 2017-11-29 15:05 • 来自相关话题

首先,实现RSA加密,需要用到pycrypto这个库,这个库又依赖openssl,所以需要先下载openssl,具体教程可以参考http://bbs.csdn.net/topics/392193545?page=1
安装完成后就可以安装pycrypto, pip install pycrypto ,如果报的错是VC++ ,那么就现在安装vc++在安装pycrypto ,https://www.microsoft.com/en-us/download/details.aspx?id=44266
java版的加密函数如下:public static String sign(byte data, final String privateKey) throws Exception {
byte keyBytes = Base64Utils.decrypt(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(privateK);
signature.update(data);
return Base64Utils.encrypt(signature.sign());
}具体的python函数如下:import hashlib
import base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto.Hash import MD5

priKey = '''-----BEGIN RSA PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN8M7oBSoZOzAoxL3tmzku/ZTtQn/BBqfe8jj0GZeFKh0IY8qDpFrNONzxp4S+TH4xCXYyEFkkEIcS9SKMCbqba
-----END RSA PRIVATE KEY-----'''

def sign(self, signdate):
reload(sys)
sys.setdefaultencoding('utf-8')
h=MD5.new(signdate)
signer = PKCS1_v1_5.new(RSA.importKey(priKey))
signn = signer.sign(h)
signn=base64.urlsafe_b64encode(signn)
return signnpriKey是私钥,每个公司的私钥是不一样的。

在robotframework中导入自己写的py文件就可以调用sign了,但是这个签名结果后面多了一个‘=’,需要加一步替换,把=替换为空,





在python内置的base64库中,可以直接进行编码,base64.b64encode,但是编码后的数据可能会出现‘+’或者‘/’,这在rul中是不能作为参数的,而base64.rulsafe_b64encode则把‘+’或‘/’转换成‘-‘或者’_‘。具体编码函数看需求,如果是做url则必须用urlsafe
Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉,这也就是上面提到的为什么多了一个’=‘。

get。
接口测试第一步是创建session,第一个参数是alias,也就是命名,识别用的,第二个参数为url,第二行为rsa加密,看需要,第五行是创建头文件(具体参数看公司需求),第六行是参数变量,第八行即为连接api,第一个参数是alias,需要跟上面的保持一致,第二个参数是uri,第三第四为头文件跟参数变量





 
post
post跟get基本一致,在post需要注意接口传参是用data还是用params。params是在请求url里的参数,而data是请求body里的,可以是json,也可以是urlencoded,试具体情况而定(经雪霁大神指正)。





data如下,其实也就是把params改成data





 
使用params还是data对签名也有影响,使用params时,签名需要把所有参数附上,而且得按字母排序,用data时就不用加上参数。(本公司RSA加密的签名规则是这样,其他公司的具体的就不知道了,不懂得可以问问公司开发人员)具体如下:/public/corporate/fund/proposa?fundCode=${fundCode}&investmentAmount=${investmentAmount}&x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0
/public/corporate/fund?x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0在我这里,rsa加密,如果参数是json格式,那么在加密的时候是不需要加参数的,参数直接在post request用data进行传输,数据在这里有一个需要注意的地方,那就是{
"accountNumber": "IF2016070100000044",
"corporateUserCode": 0,
"investorPayId": 28,
"merchantNumber": "IF2017112100003",
"password": "if123",
"payMethod": 0,
"purchaseFunds": [
{
"currency": "156",
"fundCode": "0408",
"investmentAmount": 10
}
],
"riskConfirmed": 1
}json里面有没有出现数组,即有没有出现中括号’[’,‘ ]‘,有的话,需要先进行create dictionary 之后再进行create list,这样传输的数据才能正确。

时间戳:
获取当前时间的时间戳为:${date} get time epoch;get time 是内置库BuiltIn的关键字
把时间转成时间戳:${date} Convert Date 2017-11-22 10:00:00 epoch;Convert Date是Date Time库的关键字
把时间戳转成时间:${date} get time ‘空一格’ ${time};注意在空一格那位置上空一格。。
 
有什么错误的地方欢迎大家指点,共同学习。 查看全部
首先,实现RSA加密,需要用到pycrypto这个库,这个库又依赖openssl,所以需要先下载openssl,具体教程可以参考http://bbs.csdn.net/topics/392193545?page=1
安装完成后就可以安装pycrypto, pip install pycrypto ,如果报的错是VC++ ,那么就现在安装vc++在安装pycrypto ,https://www.microsoft.com/en-us/download/details.aspx?id=44266
java版的加密函数如下:
public static String sign(byte data, final String privateKey) throws Exception {
byte keyBytes = Base64Utils.decrypt(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(privateK);
signature.update(data);
return Base64Utils.encrypt(signature.sign());
}
具体的python函数如下:
import hashlib
import base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto.Hash import MD5

priKey = '''-----BEGIN RSA PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN8M7oBSoZOzAoxL3tmzku/ZTtQn/BBqfe8jj0GZeFKh0IY8qDpFrNONzxp4S+TH4xCXYyEFkkEIcS9SKMCbqba
-----END RSA PRIVATE KEY-----'''

def sign(self, signdate):
reload(sys)
sys.setdefaultencoding('utf-8')
h=MD5.new(signdate)
signer = PKCS1_v1_5.new(RSA.importKey(priKey))
signn = signer.sign(h)
signn=base64.urlsafe_b64encode(signn)
return signn
priKey是私钥,每个公司的私钥是不一样的。

在robotframework中导入自己写的py文件就可以调用sign了,但是这个签名结果后面多了一个‘=’,需要加一步替换,把=替换为空,

替换.PNG

在python内置的base64库中,可以直接进行编码,base64.b64encode,但是编码后的数据可能会出现‘+’或者‘/’,这在rul中是不能作为参数的,而base64.rulsafe_b64encode则把‘+’或‘/’转换成‘-‘或者’_‘。具体编码函数看需求,如果是做url则必须用urlsafe
Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉,这也就是上面提到的为什么多了一个’=‘。

get。
接口测试第一步是创建session,第一个参数是alias,也就是命名,识别用的,第二个参数为url,第二行为rsa加密,看需要,第五行是创建头文件(具体参数看公司需求),第六行是参数变量,第八行即为连接api,第一个参数是alias,需要跟上面的保持一致,第二个参数是uri,第三第四为头文件跟参数变量

get.PNG

 
post
post跟get基本一致,在post需要注意接口传参是用data还是用params。params是在请求url里的参数,而data是请求body里的,可以是json,也可以是urlencoded,试具体情况而定(经雪霁大神指正)。
pos.PNG


data如下,其实也就是把params改成data

post——data.png

 
使用params还是data对签名也有影响,使用params时,签名需要把所有参数附上,而且得按字母排序,用data时就不用加上参数。(本公司RSA加密的签名规则是这样,其他公司的具体的就不知道了,不懂得可以问问公司开发人员)具体如下:
/public/corporate/fund/proposa?fundCode=${fundCode}&investmentAmount=${investmentAmount}&x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0
/public/corporate/fund?x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0
在我这里,rsa加密,如果参数是json格式,那么在加密的时候是不需要加参数的,参数直接在post request用data进行传输,数据在这里有一个需要注意的地方,那就是
{
"accountNumber": "IF2016070100000044",
"corporateUserCode": 0,
"investorPayId": 28,
"merchantNumber": "IF2017112100003",
"password": "if123",
"payMethod": 0,
"purchaseFunds": [
{
"currency": "156",
"fundCode": "0408",
"investmentAmount": 10
}
],
"riskConfirmed": 1
}
json里面有没有出现数组,即有没有出现中括号’[’,‘ ]‘,有的话,需要先进行create dictionary 之后再进行create list,这样传输的数据才能正确。

时间戳:
获取当前时间的时间戳为:${date} get time epoch;get time 是内置库BuiltIn的关键字
把时间转成时间戳:${date} Convert Date 2017-11-22 10:00:00 epoch;Convert Date是Date Time库的关键字
把时间戳转成时间:${date} get time ‘空一格’ ${time};注意在空一格那位置上空一格。。
 
有什么错误的地方欢迎大家指点,共同学习。

rf装逼神器--evaluate

雪霁 发表了文章 • 6 个评论 • 4454 次浏览 • 2017-11-10 16:26 • 来自相关话题

装逼之前先稍微科普一下:
Robotframework 中的evaluate关键字底层的代码使用的是python的eval函数,
eval语句用来计算存储在代码对象或字符串中的有效的Python表达式,eval函数的语法:eval(source[, globals[, locals]]) -> value


eval函数是用来动态地执行一个表达式的字符串,或者compile函数编译出来的代码对象。参数source是一个表达式字符串,或者表示编译出来代码对象的名称;参数globals是全局命名空间,可以指定执行表达式时的全局作用域的范围,比如指定某些模块可以使用。如果本参数缺省,就使用当前调用这个函数的当前全局命名空间;参数locals是局部作用域命名空间,是用来指定执行表达式时访问的局部命名空间。如果全局命名空间参数出现,但缺省内置模块,那么会自动拷贝这个模块到全局命名空间,意味着无论怎么设置,都可以使用内置模块。如果两个命名空间,都使用缺省方式,就会使用调用这个函数时的命名空间来查找相应的变量。
 
在Evaluate关键字,对外只暴露了入参source和globals,看源码locals留给rf内部变量了,2.9以后表达式‘$variable’变得屌屌的。
 
概念有点难理解。。。瞬间感觉这个逼要装不下去了,还是一起看下面的具体使用技巧吧:
1、转换和计算
1.1  将字符串表达式转为list,dict,tuple









 
1.2 复杂字符串转成你想要的json的样子









 
1.3  简单的数学运算









 
1.4 python函数式编程等









 
1.5 复杂一点的带多个命名空间的运算









 
 
注意事项,字符串中有’\n’会转换失败,转换前需先去掉!!!!
 
2、使用python的builtin函数
2.1 获取、判断数据类型

这个在上面的例子中已经有了,放这主要讲一下原理哈${str} set variable 123
${type} evaluate type($str)由于带花括号时,rf的evaluate的运算机制是:
第1步 将最后一格的表达式替换,用的是直接字符串相加的方法,替换的结果是: ‘type(123)’,没毛病
第2步,eval运算,type(123)当然是int类型的啦,真是简单粗暴耿直

然后我们来看一下不带花括号的:
第一步,将字符串切了,比如例子中的,会切成 type,(,$,str,)
第二步,找到$及紧随其后的那个元素,就是str,然后在rf的命名空间里找这个的变量,要是找到了,就把它标记为 RF_VAR_str,同时一并把其真实值也对应上
第三步,进行eval运算,这个运算就是很正常的运算了,运算出的结果和python算出来是一样一样的,type($str)为unicode(注意,如没做特殊处理,rf格子里的变量读出来都是unicode类型)
 
2.2 求round, json.loads or json.dumps等,具体例子见附件
 

2.3 表达式判断,各种if
讲Rf的evaluate,就不得不引申到条件判断的关键字,即带if的关键字,如:run keyword if,set variable if, pass execution if...这是由于if后面跟的表达式都由evaluate操刀,因此,我们可以做python的任意一种判断。同理断言关键字should be true也可以这么玩,底层也是用的evaluate。
关于这个判断,很多人都跳过坑,其根本原因,就是evaluate先替换后运算的机制。


最后,记住一点,就是,凡是想要变量保持原有的变量类型的,都使用$variable的形式,其他的用${variable}就可以了。
 
道长有一篇博客专门讲这个,我这里主要是做一些补充,另外2.9版本后新表达式真的非常灵活,弥补了之前evaluate表达式的诸多短板。例子大部分都是做接口测试时的实例方法,接口测试的日常就是dict、list、tuple和string,evaluate和Collectoins库搭配起来用不能更趁手。
 
附件有精选的例子,可以下载运行找下感觉

  查看全部
装逼之前先稍微科普一下:
Robotframework 中的evaluate关键字底层的代码使用的是python的eval函数,
eval语句用来计算存储在代码对象或字符串中的有效的Python表达式,eval函数的语法:
eval(source[, globals[, locals]]) -> value


eval函数是用来动态地执行一个表达式的字符串,或者compile函数编译出来的代码对象。参数source是一个表达式字符串,或者表示编译出来代码对象的名称;参数globals是全局命名空间,可以指定执行表达式时的全局作用域的范围,比如指定某些模块可以使用。如果本参数缺省,就使用当前调用这个函数的当前全局命名空间;参数locals是局部作用域命名空间,是用来指定执行表达式时访问的局部命名空间。如果全局命名空间参数出现,但缺省内置模块,那么会自动拷贝这个模块到全局命名空间,意味着无论怎么设置,都可以使用内置模块。如果两个命名空间,都使用缺省方式,就会使用调用这个函数时的命名空间来查找相应的变量。
 
在Evaluate关键字,对外只暴露了入参source和globals,看源码locals留给rf内部变量了,2.9以后表达式‘$variable’变得屌屌的
 
概念有点难理解。。。瞬间感觉这个逼要装不下去了,还是一起看下面的具体使用技巧吧:
1、转换和计算
1.1  将字符串表达式转为list,dict,tuple

转listdict.png

转list_result.png

 
1.2 复杂字符串转成你想要的json的样子

复杂json.png

复杂json_result.png

 
1.3  简单的数学运算

calc.png

calc_result.png

 
1.4 python函数式编程等

函数式编程.png

函数式_result.png

 
1.5 复杂一点的带多个命名空间的运算

random.png

random_result.png

 
 
注意事项,字符串中有’\n’会转换失败,转换前需先去掉!!!!
 
2、使用python的builtin函数
2.1 获取、判断数据类型

这个在上面的例子中已经有了,放这主要讲一下原理哈
${str} set variable 123
${type} evaluate type($str)
由于带花括号时,rf的evaluate的运算机制是:
第1步 将最后一格的表达式替换,用的是直接字符串相加的方法,替换的结果是: ‘type(123)’,没毛病
第2步,eval运算,type(123)当然是int类型的啦,真是简单粗暴耿直

然后我们来看一下不带花括号的:
第一步,将字符串切了,比如例子中的,会切成 type,(,$,str,)
第二步,找到$及紧随其后的那个元素,就是str,然后在rf的命名空间里找这个的变量,要是找到了,就把它标记为 RF_VAR_str,同时一并把其真实值也对应上
第三步,进行eval运算,这个运算就是很正常的运算了,运算出的结果和python算出来是一样一样的,type($str)为unicode(注意,如没做特殊处理,rf格子里的变量读出来都是unicode类型)

 
2.2 求round, json.loads or json.dumps等,具体例子见附件
 

2.3 表达式判断,各种if
讲Rf的evaluate,就不得不引申到条件判断的关键字,即带if的关键字,如:run keyword if,set variable if, pass execution if...这是由于if后面跟的表达式都由evaluate操刀,因此,我们可以做python的任意一种判断。同理断言关键字should be true也可以这么玩,底层也是用的evaluate。
关于这个判断,很多人都跳过坑,其根本原因,就是evaluate先替换后运算的机制。


最后,记住一点,就是,凡是想要变量保持原有的变量类型的,都使用$variable的形式,其他的用${variable}就可以了。
 
道长有一篇博客专门讲这个,我这里主要是做一些补充,另外2.9版本后新表达式真的非常灵活,弥补了之前evaluate表达式的诸多短板。例子大部分都是做接口测试时的实例方法,接口测试的日常就是dict、list、tuple和string,evaluate和Collectoins库搭配起来用不能更趁手。
 
附件有精选的例子,可以下载运行找下感觉

 

robotframework-如何切换到新窗口

雪霁 发表了文章 • 8 个评论 • 4180 次浏览 • 2017-11-06 18:47 • 来自相关话题

前提:
我们说的新窗口,统一指下图这样的窗口,即点击一个链接,产生一个新的tab页,需要到新的窗口定位元素。请各位对号入座,看清楚再服用此文章:





知识点:
这大概就是大部分人的选择性失明 及 越长越只会看图不会看字 的结果,F5查询select window用法这一条说明写在这里2年多了,九成的人表示没看到 。建议使用2.9以上的rf版本,及最新的ride版本。





 
实现:





 
 
PS: 本来不想一个关键字写一篇分享的,问的人越来越多,而且回答了用select window | new 还一句话堵不死的,后面还要他跟诸多解释为什么能这么用。So...... 查看全部
前提:
我们说的新窗口,统一指下图这样的窗口,即点击一个链接,产生一个新的tab页,需要到新的窗口定位元素。请各位对号入座,看清楚再服用此文章:

7.png

知识点:
这大概就是大部分人的选择性失明越长越只会看图不会看字 的结果,F5查询select window用法这一条说明写在这里2年多了,九成的人表示没看到 。建议使用2.9以上的rf版本,及最新的ride版本。

2.png

 
实现:

3.png

 
 
PS: 本来不想一个关键字写一篇分享的,问的人越来越多,而且回答了用select window | new 还一句话堵不死的,后面还要他跟诸多解释为什么能这么用。So......

rf变量进阶--变量文件的使用,环境快捷切换等

雪霁 发表了文章 • 4 个评论 • 2676 次浏览 • 2017-10-21 17:29 • 来自相关话题

本文解决三个问题

1、变量文件的使用
2、环境相关变量的快捷切换
3、依赖变量文件的全局变量,可在用例中更改值,给后续用例使用

相信大家和我一样,自动化测试用例一般不止运行在测试环境,通常情况下是三套环境:测试,预发布及生产环境。调试或者辅助验证测试时,切环境改变量甚是麻烦。这些变量包括但不限于:一些url信息,数据库信息,预置用户信息。

so,翻了一大遍用户手册,最后决定通过判断运行时输入的变量来返回不同的环境信息,如图所示:





然后,下面是导入Variables 视图,导入变量文件时使用args,传入变量${env},实际值为运行时为上图指定的变量值:test。





 
以下是comVars.py的内容:
注意get_variables()函数,这个是rf指定专用返回变量的函数,示例中定义的变量有 ${mainurl},${db_trade},${db_trade_pw} 及${globalvars},导入后运行时可以直接使用,等同于在suite文件或resources文件里定义的变量# -*- coding: utf-8 -*-

def get_variables(env = 'test'):
if env=='product':
#production environment
variables = {
#urlConfig
"mainurl" : "http://main.com",
#dbConfig
"db_trade" : "tradeXXX",
"db_trade_pw" : "12345678",
}

elif env=='exp':
#staging environment
variables = {
#urlConfig
"mainurl" : "http://exp.main.com",
#dbConfig
"db_trade" : "trade_exp_XXX",
"db_trade_pw" : "12345678",
}

else:
#text environment
variables = {
#urlConfig
"mainurl" : "http://test.main.com",
#dbConfig
"db_trade" : "trade_test_XXX",
"db_trade_pw" : "12345678",
}
globalvars = {'productid':'3456','userid':'test12'} #共用变量
variables['globalvars'] = globalvars

return variables这类变量文件还有更多好玩的用法,如构造某个函数动态得出值等,相对于用rf里的scalar会灵活一些,更多惊喜的用法,大家可以自己去探索。


对于上述需求,其实还有另一种选择,即在运行Arguments里填写-V参数,导入不同的variables文件,如把测试环境的所有初始变量写到testvars.py,生产的写的productionvars.py。这种方法应该更常见一些,各人各有喜好吧,我更偏向上一种些。初始化参数体量比较小时,维护一个文件比较方便。





 
然后testvars.py就长这样:# -*- coding: utf-8 -*-

#urlConfig
mainurl = 'http://test.main.com'

#dbConfig
db_trade = 'trade_test_XXX'
db_trade_pw = '1234567'

#otherVars
globalvars = {'productid':'3456','userid':'test12'}
最后,我们来探讨一下,所谓的rf的全局变量,想要在用例里改变它的值,并且想在后续用例里拿它改变后的值,的一种较迂回曲折的做法。思路:通过变量文件,利用字典update方法将改变内存里的值的特性。

如初始在文件变量里定义了一个变量userid为12,建议做法是:把它放在一个字典里,字典叫什么名字都可以,如
     globalvars = {'productid':'3456','userid':'test12'}
 
使用时,导入该变量文件,取值时用${globalvars['userid']}取,更新时用update更新,如图,图中两个suite 文件Test2和Test3都导入了该变量文件,在Test2下的case1中更新该变量,在Test3的case3下,它的值还是test13,再一次用update的方法更新时,后续所有的值都会是更新后的值。如此,达到用例中间变更变量后续可用的目的。用evaluate  update时,注意变量的写法,大括号建议都不写。










 
日志打印:






 
以上所有文件,均放在附件压缩包里,可直接运行查看效果
  查看全部
本文解决三个问题

1、变量文件的使用
2、环境相关变量的快捷切换
3、依赖变量文件的全局变量,可在用例中更改值,给后续用例使用


相信大家和我一样,自动化测试用例一般不止运行在测试环境,通常情况下是三套环境:测试,预发布及生产环境。调试或者辅助验证测试时,切环境改变量甚是麻烦。这些变量包括但不限于:一些url信息,数据库信息,预置用户信息。

so,翻了一大遍用户手册,最后决定通过判断运行时输入的变量来返回不同的环境信息,如图所示:

p1.png

然后,下面是导入Variables 视图,导入变量文件时使用args,传入变量${env},实际值为运行时为上图指定的变量值:test。

p2.png

 
以下是comVars.py的内容:
注意get_variables()函数,这个是rf指定专用返回变量的函数,示例中定义的变量有 ${mainurl},${db_trade},${db_trade_pw} 及${globalvars},导入后运行时可以直接使用,等同于在suite文件或resources文件里定义的变量
# -*- coding: utf-8 -*-

def get_variables(env = 'test'):
if env=='product':
#production environment
variables = {
#urlConfig
"mainurl" : "http://main.com",
#dbConfig
"db_trade" : "tradeXXX",
"db_trade_pw" : "12345678",
}

elif env=='exp':
#staging environment
variables = {
#urlConfig
"mainurl" : "http://exp.main.com",
#dbConfig
"db_trade" : "trade_exp_XXX",
"db_trade_pw" : "12345678",
}

else:
#text environment
variables = {
#urlConfig
"mainurl" : "http://test.main.com",
#dbConfig
"db_trade" : "trade_test_XXX",
"db_trade_pw" : "12345678",
}
globalvars = {'productid':'3456','userid':'test12'} #共用变量
variables['globalvars'] = globalvars

return variables
这类变量文件还有更多好玩的用法,如构造某个函数动态得出值等,相对于用rf里的scalar会灵活一些,更多惊喜的用法,大家可以自己去探索。


对于上述需求,其实还有另一种选择,即在运行Arguments里填写-V参数,导入不同的variables文件,如把测试环境的所有初始变量写到testvars.py,生产的写的productionvars.py。这种方法应该更常见一些,各人各有喜好吧,我更偏向上一种些。初始化参数体量比较小时,维护一个文件比较方便。

p3.png

 
然后testvars.py就长这样:
# -*- coding: utf-8 -*-

#urlConfig
mainurl = 'http://test.main.com'

#dbConfig
db_trade = 'trade_test_XXX'
db_trade_pw = '1234567'

#otherVars
globalvars = {'productid':'3456','userid':'test12'}

最后,我们来探讨一下,所谓的rf的全局变量,想要在用例里改变它的值,并且想在后续用例里拿它改变后的值,的一种较迂回曲折的做法。思路:通过变量文件,利用字典update方法将改变内存里的值的特性。

如初始在文件变量里定义了一个变量userid为12,建议做法是:把它放在一个字典里,字典叫什么名字都可以,如
     globalvars = {'productid':'3456','userid':'test12'}
 
使用时,导入该变量文件,取值时用${globalvars['userid']}取,更新时用update更新,如图,图中两个suite 文件Test2和Test3都导入了该变量文件,在Test2下的case1中更新该变量,在Test3的case3下,它的值还是test13,再一次用update的方法更新时,后续所有的值都会是更新后的值。如此,达到用例中间变更变量后续可用的目的。用evaluate  update时,注意变量的写法,大括号建议都不写。

p4.png


p5.png

 
日志打印:

p7.png


 
以上所有文件,均放在附件压缩包里,可直接运行查看效果