直达电梯:
<a href="#label1">1 robotframework RIDE的日志没显示</a>
<a href="#label2">2 出错后查看出错日志的方式:Tools->View RIDE Log</a>
<a href="#label3">3 发送requests请求后获取到的中文数据显示乱码</a>
<a href="#label4">4 RF中打不开浏览器</a>
<a href="#label5">5 RF使用Selenium2Library的时候定位不到元素</a>
<a href="#label6">6 没Get from Dictionary关键字</a>
<a href="#label7">7 如何设置全局变量</a>
<a href="#label8">8 输出日志改路径</a>
<a href="#label9">9 不想因为assert而打断执行</a>
<a href="#label10">10 If… Else if… Else 怎么不行</a>
<a href="#label11">11 导入库怎么是红色的</a>
<a href="#label12">12 弹出框怎么处理</a>
<a href="#label13">13 鼠标有悬停</a>
<a href="#label14">14 日期控件怎么处理</a>
<a href="#label15">15 下拉框怎么处理</a>
<a href="#label16">16 2选1的单选框怎么处理</a>
<a href="#label17">17 多选框怎么处理</a>
<a href="#label18">18 Click Button点不到元素</a>
<a href="#label19">19 Post的类型为multipart/form-data</a>
<a href="#label20">20 关键字需要更多的参数</a>
记录下大家遇到的坑。
1
<a id="label1">robotframework RIDE的日志没显示</a>
现象:第一次运行的时候日志能展示,再次运行脚本就没有日志了,重启ride还是出现这个问题
解决方法:
- 修改对应的python2路径\Lib\site-packages\robotide\contrib\testrunner目录下testrunner.py文件(第400行)
return信息改成如下即可:
try:
result=result.decode('UTF-8')
except UnicodeDecodeError:
pass
return result
- 删除testrunner.pyc文件
- 重新启动ride
现象:第一次运行的时候日志能展示,再次运行脚本就没有日志了,重启ride还是出现这个问题(和上面的现象一样,出现在使用Selenium2Library做UI自动化的时候)
原因
代码使用的是谷歌浏览器、IE浏览器测试,运行一次后chromedriver.exe,IEDriverServer.exe进程仍在运行中。
解决方案
方法一:每次运行后,手动关闭chromedriver.exe或者IEDriverServer.exe;
方法二:将下面代码保存为批处理,每次运行后手动运行一下:
taskkill /f /im chromedriver.exe
taskkill /f /im IEDriverServer.exe
方法三:封装成keywords
step1:
def close_process(self, process_name): """Close a process by process name.""" if process_name[-4:].lower() != ".exe": process_name += ".exe" os.system("taskkill /f /im " + process_name)
step2:
保存上述文件至py文件,然后在RIDE中引用,并创建关键字
Teardown Close Process chromedriver #谷歌
Close Process IEDriverServer #IE
step3:
将Teardown加入test setting:
*** Settings *** Test Teardown Teardown
2
<a id="label2">出错后查看出错日志的方式:Tools->View RIDE Log</a>
<a id="label3">发送requests请求后获取到的中文数据显示乱码</a>
10.jpg原因:万恶的Python各种转码编码
解决方案:
- 确保你的版本是robotframework3.x
- 用以下的脚本替换掉Python27安装目录下的\Lib\site-packages\robot\utils\unic.py
# Copyright 2008-2015 Nokia Networks
# Copyright 2016- Robot Framework Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from pprint import PrettyPrinter
from .platform import IRONPYTHON, JYTHON, PY2
from .robottypes import is_bytes, is_unicode
import json
if PY2:
def unic(item):
if isinstance(item, unicode):
return item
if isinstance(item, (bytes, bytearray)):
try:
return item.decode('ASCII')
except UnicodeError:
return u''.join(chr(b) if b < 128 else '\\x%x' % b
for b in bytearray(item))
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='gbk')
except:
pass
except:
pass
try:
try:
return unicode(item)
except UnicodeError:
return unic(str(item))
except:
return _unrepresentable_object(item)
else:
def unic(item):
if isinstance(item, str):
return item
if isinstance(item, (bytes, bytearray)):
try:
return item.decode('ASCII')
except UnicodeError:
return ''.join(chr(b) if b < 128 else '\\x%x' % b
for b in item)
try:
return str(item)
except:
return _unrepresentable_object(item)
# JVM and .NET seem to handle Unicode normalization automatically. Importing
# unicodedata on Jython also takes some time so it's better to avoid it.
if not (JYTHON or IRONPYTHON):
from unicodedata import normalize
_unic = unic
def unic(item):
return normalize('NFC', _unic(item))
def prepr(item, width=400):
return unic(PrettyRepr(width=width).pformat(item))
class PrettyRepr(PrettyPrinter):
def format(self, object, context, maxlevels, level):
try:
if is_unicode(object):
return repr(object).lstrip('u'), True, False
if is_bytes(object):
return 'b' + repr(object).lstrip('b'), True, False
return PrettyPrinter.format(self, object, context, maxlevels, level)
except:
return _unrepresentable_object(object), True, False
def _unrepresentable_object(item):
from .error import get_error_message
return u"<Unrepresentable object %s. Error: %s>" \
% (item.__class__.__name__, get_error_message())
修改后运行脚本显示结果如下:
11.jpg4 . <a id="label4">RF中打不开浏览器</a>
在RF中执行脚本无法打开chrome浏览器,或者打开的浏览器不是自己想要的配置
原因:浏览器版本和driver不对应。
比如报错:
WebDriverException: Message: u'unknown error: cannot find Chrome binary\n (Driver info: chromedriver=2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed),platform=Windows NT 6.1.7601 SP1 x86_64)'
下载对应的driver,Chromedriver的镜像地址(http://chromedriver.storage.googleapis.com/)
或者 使用pip install -U selenium==2.53.6 把你对应的Selenium一定要设置为Seleni
5 . <a id="label5">RF使用Selenium2Library的时候定位不到元素</a>
经常有人问这个元素找不到,一般先排除这两个地方,再自己找找
A:是否等待了足够的时间让元素加载 (增加sleep xx, wait Until xxx)
B: 仔细查查,这个元素是否进入到另一个frame了 (select frame xxx)
上面两点都确定了还不行,那改变下xpath的方法,另外也可以多试试下面的方法:
C:xpath = //div[text()='web上显示的文本'] 根据文本匹配
还有一文本前后可能有空格,特殊字符,可以用部分文本来匹配
D:xpath = //div[contains(text(),'部分文本')]
E:还有找父节点的方法: ../ 这个自己去看看,会有收获的。
(CC先生说:准确的说,这个是Selenium webdriver定位的问题,RF背锅了而已。)
同时如何判断这个元素disable,或者置灰了呢?
用F12仔细看看元素灰了和没灰,disable和enable的区别,基本都能看到有的属性发生了改变, class的值多了或者少了checked, 或者disable等;
一般这种会用到 get element attribute关键字,如下获取class的属性
${class_value} Get Element Attribute xpath=//div[@id=’123’]@class
你再判断 ${class_value}是否包含 disable,或者 check就可以得到其状态了
6 . <a id="label6">没Get from Dictionary关键字</a>
原因:没加载必须的库
建议:新手必须加载的库
BuiltIn RF系统内部的,最基础的Run keyword xxx都在这里
String 字符串处理的库,文本处理必备
Collections 字典,列表的库,必备
Selenium2Library web测试入门库
OperatingSystem 操作windows系统命令,处理文件时要用到
AutoItLibrary 鼠标、键盘操作windows控件用这个
7 . <a id="label7">如何设置全局变量</a>
RF变量的内部变量
${aaa} Set Variable haha 这个${aaa}是普通变量,就本case能用
Set suite variable ${aaa} 这个${aaa}就是测试suite变量
set global variable ${aaa} 全局变量${aaa},在哪都能传
Set Test Variable ${aaa} (有见到人用,但具体使用时候的不同点还没有找到)
8 . <a id="label8">输出日志改路径</a>
在运行界面:Arguments右边输入框这样写 -l E:\Robot_log\smoke_test_log -r E:\Robot_log\smoke_test_report
-l 是log的路径参数
-r 是report的路径参数
如果还有其他执行脚本的需求,请命令行pybot -? 自己看看,都在这里
9 . <a id="label9">不想因为assert而打断执行</a>
用这个几个,保证让你停不下来的节奏。。。
Run Keyword And Return Status,
Run Keyword And Ignore Error
Run Keyword And Continue on Failure
10 . <a id="label10">If… Else if… Else 怎么不行</a>
这个确实是rf的坑,平时keyword都没区分大小写,但是这套IF语句一定要大写。
还有比较的时候,${aaa} == ${bbb}报语法错误,
因为你比较的时候没这样 ‘${aaa}’ == ‘${bbb}’ (请加上英文的单引号)
11 . <a id="label11">导入库怎么是红色的</a>
第一:请确定你是用pip在线安装的,其他下载文件安装很可能没安装好。
第二:请注意库名的大小写
第三,如果是你自己的自定义库红色,先运行下,看提示log,报错误在哪行,自己搞定语法错误
12 . <a id="label12">弹出框怎么处理</a>
一般处理弹窗先增加等待,容错处理
先用这个试试:Dismiss Alert
不行再用下面的
Choose Ok On Next Confirmation
Confirm action
顺便:get alert message --- 获取弹出窗的信息
13 . <a id="label13">鼠标有悬停</a>
需要验证提示信息,(提示输入非法等等)用到鼠标悬停
Mouse Over xxx这样鼠标就挺在那了
马上去获取提示信息,get text xxx
14 . <a id="label14">日期控件怎么处理</a>
据说现在还没有日期控件,没有关键字对应,需要自己封装
- <a id="label15">下拉框怎么处理</a>
在浏览器F12下拉框
【正规的长这样 <option xxx> ,像下面这么用:
Select from List xpath=//xxx/xxx
Selct from List by value xxxx
非正规的下拉一般长这样: <div xxxx >,
你就用下面方式
Click Element xpath = //xxx/div[2] ##先点下拉按钮
Click Element xpath=//xxx/xxx//div[text()='坦克程咬金'] ##再点下拉框中的元素
16 . <a id="label16">2选1的单选框怎么处理</a>
官方称为Radio Button,在RF的selenium库中F5搜索 radio就有了
Select radio button xxx 男
17 . <a id="label17">多选框怎么处理</a>
Select checkbox
18 . <a id="label18">Click Button点不到元素</a>
可以尝试下: click element
19 .<a id="label19">Post的类型为multipart/form-data</a>
Content-Type的方式有很多种,可参见:http://tool.oschina.net/commons/
Post常见的四种方式为:
- application/x-www-form-urlencoded
- multipart/form-data
- application/json
- text/xml
第一种和第三,四种都比较好处理,第二种方式这里有点坑。
解决的思路之一是把需要传递的form数据另存为一个文件,然后用Get Binary File关键字将其读取。
如果要使用Get Binary File的时候需要先导入OperatingSystem库。
上例中的post.txt中存储的就是form的数据(放在当前的项目目录下即可)。格式如下:
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="ajax"
0
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="status"
1
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="add_file"
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="opmode"
add
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="name"
PPTname
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="link"
http://localhost/p
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="color"
se
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="color"
se
------WebKitFormBoundary5t4icDNFNegeoaGA
Content-Disposition: form-data; name="content"
------WebKitFormBoundary5t4icDNFNegeoaGA--
其它的格式可参见:https://github.com/bulkan/robotframework-requests/blob/master/tests/testcase.txt
20 <a id="label20">关键字需要更多的参数</a>
need more Arguments.png自定义关键字的时候不能已导入的测试库或者Builtin的库中的关键字重名,否则就会出现不知道关键词是属于哪一个库的关键词的错误。
网友评论