RobotFrameWork

robotframework Error总结

2017-07-06  本文已影响906人  CC先生之简书

直达电梯:
<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常见的四种方式为:

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

上一篇下一篇

猜你喜欢

热点阅读