1.PO模型简介
PO模型即page Objects,直译意思就是“页面对象”,通俗的讲就是把一个页面,或者说把一个页面的某个区域当做一个对象,通过封装这个对象可以实现调用。
举个最简单的栗子:
登录XX首页验证三种场景
场景一:有输入正确的账号和密码
场景二:输入正确的账号和错误的密码
场景三:输入正确的账号+密码为空
思路:
我需要重复编写登录xx的首页登录的脚本执行这三个用例,这时候我可以把登录xx首页的页面当做一个类“登录xx首页”,每次需要登录的时候调用这个类,
假如这个登录页面有UI元素改变或者新增登录功能点,我们只需要修改这个类即可,简而言之就是页面中重复使用的页面,可以进行抽象封装成“类”,实现通用,
并且关于封装的“类”的命名,尽量能体现类的行为特点,例如新增组织架构员工,封装了一个新增员工弹窗的“类”:进入新增员工窗口
优点:
1.减少了脚本的冗余和维护脚本的精力
2.页面对象与用例分离,使得我们更好的复用
3.增加了用例的可读性
2.数据驱动简介
**
数据驱动核心思想就是实现数据与代码的分离,这么做的目的,其实也是为了脚本的易于维护,robotframework框架其实采用的是江湖中说的关键字驱动,那么怎么基于robotframework实现数据驱动呢?
2.1 create list
结合上面登录的例子,假如现在有一个场景,需要多次登录账号,如果不基于数据驱动,那个我们可能需要写多份脚本,假如我们通过create list来实现,
如下文,通过创建一个列表和循环在重复登录不同账号,不过这种方式当数据多的时候,未免有所不足。
列表-多次登录兔展账号
${account_list} Create List 15813349620 13282648174
${pw_list} Create List 111111 111111
FOR ${i} IN RANGE 0 2
登录兔展首页 ${account_list}[${i}] ${pw_list}[${i}]
END
*** Keywords ***
登录兔展首页
# 简单的封装登录弹窗页面,即上文所讲的PO对象的概念
[Arguments] ${account} ${password}
Log Many ${account} ${password}
Open Browser ${test_url} ${chromeless}
Maximize Browser Window
Wait Until Element Is Enabled css=#g-j-signin-btn 5
Click Element css=#g-j-signin-btn
Select Frame css=#sso
Wait Until Element Is Enabled css=[title=xx账户] 5
Click Element css=[title=xx账户]
Wait Until Element Is Enabled css=[placeholder=请输入你的登录账户] 5
Input Text css=[placeholder=请输入你的登录账户] ${account}
Wait Until Element Is Enabled css=[placeholder=请输入密码] 5
Input Text css=[placeholder=请输入密码] ${password}
Wait Until Element Is Enabled //button[@class="g-btn login-btn do-btn"]
Click Element //button[@class="g-btn login-btn do-btn"] #登录
2.2 Template
Template也是robotframework框架可以实现数据驱动的一种方式,如下文,在 Keywords 下封装了一个“登录首页”的类,并且设置作为“模板”,
Test Cases 下就是在“继承”了登录首页模板的前提下,可直接编写我们的登录首页的测试用例,当我们的测试用例需要增加或者变动,维护起来就更加方便
*** Test Cases ***
模板-登录账号密码验证
[Template] 登录首页
#登录首页用例
${EMPTY} ${EMPTY} 请输入登录账号
15813349620 111111 PASS
15813349620 ${EMPTY} 请输入6-20位字符的密码
15966666666 111111 登录用户不存在,请先注册
*** Keywords ***
登录首页
[Arguments] ${account} ${password} ${err_info}
Log Many ${account} ${password} ${err_info}
Open Browser ${test_url} ${chromeless}
Maximize Browser Window
Wait Until Element Is Enabled css=#g-j-signin-btn 5
Click Element css=#g-j-signin-btn
Select Frame css=#sso
Wait Until Element Is Enabled css=[title=xx账户] 5
Click Element css=[title=xx账户]
Wait Until Element Is Enabled css=[placeholder=请输入你的登录账户] 5
Input Text css=[placeholder=请输入你的登录账户] ${account}
Wait Until Element Is Enabled css=[placeholder=请输入密码] 5
Input Text css=[placeholder=请输入密码] ${password}
Wait Until Element Is Enabled //button[@class="g-btn login-btn do-btn"]
Click Element //button[@class="g-btn login-btn do-btn"] #登录
${login_info} Run Keyword And Ignore Error Wait Until Element Is Not Visible //button[@class="g-btn login-btn do-btn"]
#通过js获取登录信息
${user_login_info} Run Keyword If '${login_info[0]}'=='FAIL' Execute Javascript return document.getElementsByClassName("error-tips")['1'].textContent
... ELSE IF '${login_info[0]}'=='PASS' Set Variable PASS
Unselect Frame
#断言
Should Be Equal As Strings ${user_login_info} ${err_info}