美文网首页RobotFrameWork
robotframework Error总结

robotframework Error总结

作者: CC先生之简书 | 来源:发表于2017-07-06 15:18 被阅读906次

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

    相关文章

      网友评论

      本文标题:robotframework Error总结

      本文链接:https://www.haomeiwen.com/subject/vebhhxtx.html