robotframework Error总结

直达电梯:
<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还是出现这个问题
解决方法:

  1. 修改对应的python2路径\Lib\site-packages\robotide\contrib\testrunner目录下testrunner.py文件(第400行)
    return信息改成如下即可:
try:        
     result=result.decode('UTF-8')    
except UnicodeDecodeError:        
     pass    
return result
  1. 删除testrunner.pyc文件
  2. 重新启动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>

10.png

<a id="label3">发送requests请求后获取到的中文数据显示乱码</a>

10.jpg

原因:万恶的Python各种转码编码
解决方案:

  1. 确保你的版本是robotframework3.x
  2. 用以下的脚本替换掉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.jpg

4 . <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>
据说现在还没有日期控件,没有关键字对应,需要自己封装

  1. <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关键字将其读取。
12.png

如果要使用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的库中的关键字重名,否则就会出现不知道关键词是属于哪一个库的关键词的错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 注入攻击的分类 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传...
    查无此人asdasd阅读 1,540评论 0 5
  • [SQL注入攻击] SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式...
    James黄杰阅读 2,557评论 0 30
  • scrapy学习笔记(有示例版) 我的博客 scrapy学习笔记1.使用scrapy1.1创建工程1.2创建爬虫模...
    陈思煜阅读 12,587评论 4 46
  • 下午本来打算去看电影《美女与野兽》,可是后来又没看成,本来有些一点失望,在商场随意逛逛发现了一家新开的书店,不经意...
    源源哒阅读 311评论 0 0
  • 譬如朝露 雾聚而生,雾散而灭 生,沾花沾尘沾红袖 灭,无踪无影无牵挂 生灭原本天时往复 偏惹得 多情人自扰 譬如浮...
    云中过阅读 326评论 0 2