1.PO模型简介

    PO模型即page Objects,直译意思就是“页面对象”,通俗的讲就是把一个页面,或者说把一个页面的某个区域当做一个对象,通过封装这个对象可以实现调用。

    举个最简单的栗子:
    登录XX首页验证三种场景
    场景一:有输入正确的账号和密码
    场景二:输入正确的账号和错误的密码
    场景三:输入正确的账号+密码为空

    思路:
    我需要重复编写登录xx的首页登录的脚本执行这三个用例,这时候我可以把登录xx首页的页面当做一个类“登录xx首页”,每次需要登录的时候调用这个类,
    假如这个登录页面有UI元素改变或者新增登录功能点,我们只需要修改这个类即可,简而言之就是页面中重复使用的页面,可以进行抽象封装成“类”,实现通用,
    并且关于封装的“类”的命名,尽量能体现类的行为特点,例如新增组织架构员工,封装了一个新增员工弹窗的“类”:进入新增员工窗口

    优点:
    1.减少了脚本的冗余和维护脚本的精力
    2.页面对象与用例分离,使得我们更好的复用
    3.增加了用例的可读性

    2.数据驱动简介
    **
    数据驱动核心思想就是实现数据与代码的分离,这么做的目的,其实也是为了脚本的易于维护,robotframework框架其实采用的是江湖中说的关键字驱动,那么怎么基于robotframework实现数据驱动呢?

    2.1 create list
    结合上面登录的例子,假如现在有一个场景,需要多次登录账号,如果不基于数据驱动,那个我们可能需要写多份脚本,假如我们通过create list来实现,
    如下文,通过创建一个列表和循环在重复登录不同账号,不过这种方式当数据多的时候,未免有所不足。

    1. 列表-多次登录兔展账号
    2. ${account_list} Create List 15813349620 13282648174
    3. ${pw_list} Create List 111111 111111
    4. FOR ${i} IN RANGE 0 2
    5. 登录兔展首页 ${account_list}[${i}] ${pw_list}[${i}]
    6. END
    7. *** Keywords ***
    8. 登录兔展首页
    9. # 简单的封装登录弹窗页面,即上文所讲的PO对象的概念
    10. [Arguments] ${account} ${password}
    11. Log Many ${account} ${password}
    12. Open Browser ${test_url} ${chromeless}
    13. Maximize Browser Window
    14. Wait Until Element Is Enabled css=#g-j-signin-btn 5
    15. Click Element css=#g-j-signin-btn
    16. Select Frame css=#sso
    17. Wait Until Element Is Enabled css=[title=xx账户] 5
    18. Click Element css=[title=xx账户]
    19. Wait Until Element Is Enabled css=[placeholder=请输入你的登录账户] 5
    20. Input Text css=[placeholder=请输入你的登录账户] ${account}
    21. Wait Until Element Is Enabled css=[placeholder=请输入密码] 5
    22. Input Text css=[placeholder=请输入密码] ${password}
    23. Wait Until Element Is Enabled //button[@class="g-btn login-btn do-btn"]
    24. Click Element //button[@class="g-btn login-btn do-btn"] #登录

    2.2 Template
    Template也是robotframework框架可以实现数据驱动的一种方式,如下文,在 Keywords 下封装了一个“登录首页”的类,并且设置作为“模板”,
    Test Cases 下就是在“继承”了登录首页模板的前提下,可直接编写我们的登录首页的测试用例,当我们的测试用例需要增加或者变动,维护起来就更加方便

    1. *** Test Cases ***
    2. 模板-登录账号密码验证
    3. [Template] 登录首页
    4. #登录首页用例
    5. ${EMPTY} ${EMPTY} 请输入登录账号
    6. 15813349620 111111 PASS
    7. 15813349620 ${EMPTY} 请输入6-20位字符的密码
    8. 15966666666 111111 登录用户不存在,请先注册
    9. *** Keywords ***
    10. 登录首页
    11. [Arguments] ${account} ${password} ${err_info}
    12. Log Many ${account} ${password} ${err_info}
    13. Open Browser ${test_url} ${chromeless}
    14. Maximize Browser Window
    15. Wait Until Element Is Enabled css=#g-j-signin-btn 5
    16. Click Element css=#g-j-signin-btn
    17. Select Frame css=#sso
    18. Wait Until Element Is Enabled css=[title=xx账户] 5
    19. Click Element css=[title=xx账户]
    20. Wait Until Element Is Enabled css=[placeholder=请输入你的登录账户] 5
    21. Input Text css=[placeholder=请输入你的登录账户] ${account}
    22. Wait Until Element Is Enabled css=[placeholder=请输入密码] 5
    23. Input Text css=[placeholder=请输入密码] ${password}
    24. Wait Until Element Is Enabled //button[@class="g-btn login-btn do-btn"]
    25. Click Element //button[@class="g-btn login-btn do-btn"] #登录
    26. ${login_info} Run Keyword And Ignore Error Wait Until Element Is Not Visible //button[@class="g-btn login-btn do-btn"]
    27. #通过js获取登录信息
    28. ${user_login_info} Run Keyword If '${login_info[0]}'=='FAIL' Execute Javascript return document.getElementsByClassName("error-tips")['1'].textContent
    29. ... ELSE IF '${login_info[0]}'=='PASS' Set Variable PASS
    30. Unselect Frame
    31. #断言
    32. Should Be Equal As Strings ${user_login_info} ${err_info}