登录权限校验脚本实现
上一章节对测试框架进行了封装,这个章节主要来详细介绍下具体的脚本实现。
比如现在要实现如下一个用例:
自动化的实现之前我们介绍过可以大概分为三个步骤,控件定位、控件操作、校验点编写,前两个步骤我们上面的章节介绍得差不多了,关于校验点的编写也很简单,可以通过单元测框架如TestNG提供的断言种类来进行,如断定某个东西为真或者假、某两个东西是相等或者不等、某个东西是否为空等,单元测试框架都有提供对应的断言方法来进行断言。
我们这用例检验点是主要是来断定登录界面要被打开,我们可以封装如下方法返回一个布尔值要来得到当前的登录页面是否被打开:
在PageLogin类里面添加如下方法(上面已经有封装过,这边直接摘取出来),
//判断是否登录界面打开的方法
public boolean isLoginScreenOpened(){
boolean result = false;
if(getLoginBtn() != null){
return getLoginBtn().isDisplayed();
}
return result;
}
这里是通过判断登录按钮是否显示来进行判断的,当然也可以有其他方式来进行校验,大家可以选择一个合适的校验方式都可以。
这时候我可以来实现这个脚本(新建一个包,如testcase.login):
package appium.testcaess.login;
import appium.common.BasicTestCase;
import org.testng.annotations.Test;
import static org.testng.AssertJUnit.assertTrue;
//继承抽取的父类,主要关注于具体的脚本实现即可
public class LoginPermissionCheck extends BasicTestCase {
@Test
public void testName() throws Exception {
//通过导航类进行切换
pageHelper.getPageCommon().goToMySettingsTab();
//获取我的设置页面Page类,调用点击我的消息列表项的方法
pageHelper.getPageMySettings().clickMyMsgItem();
check();
pageHelper.getPageMySettings().clickMyMsgItem();
check();
pageHelper.getPageMySettings().clickMyActivityItem();
check();
pageHelper.getPageMySettings().clickMyTeamItem();
check();
}
//每个页面的校验都一致,所以可以进行简单的封装
public void check(){
//调用testng的断言,断定登录页面被打开
assertTrue(pageHelper.getPageLogin().isLoginScreenOpened());
//调用硬件放回回到我的设置页面
pageHelper.getPageCommon().goBack();
}
}
通过上面的脚本可以看到现在所有的操作都是通过PagerHelper的对象来获取需要操作的Page类,然后选择需要的方法,所有的测试步骤都是类似的选择拼凑而成。
假设现在要实现如下用例
步骤1~4通过之前Page类的抽取都能覆盖到,这时候看下步骤5,成功登录可以先手动登录下,然后摘取可以要来校验的点,这里我通过校验登录后的昵称是否和预期的一致来作为校验成功的验证点,因为登录成功的界面也是在我的设置页面,所以打开PageMySettings页面类,然后看到有封装了如下的方法用获取昵称的文本值:
//封装获取昵称文本的方法
public String getNickName(){
return helper.getText(getNickNameTextView());
}
这时候就可以具体来实现这个用例,一样是通过PageHelper的对象引用来调用需要的Page类,进而调用封装好的方法,代码如下:
package appium.testcaess.login;
import appium.common.BasicTestCase;
import org.testng.annotations.Test;
import static org.testng.AssertJUnit.assertEquals;
public class LoginWithRightCredential extends BasicTestCase {
@Test
public void testLoginWithRightCredential() throws Exception {
//切换到我的设置页面
pageHelper.getPageCommon().goToMySettingsTab();
//点击登录按钮
pageHelper.getPageMySettings().clickLoginIcon();
//登录
pageHelper.getPageLogin().login("735723619@qq.com","12345678");
//校验昵称为aotu12345aotu,如果是的话代表成功登录,不是就是登录校验失败
assertEquals("aotu12345aotu",pageHelper.getPageMySettings().getNickName());
}
}
执行下这个脚本,就可以看到脚本是通过的。
这个脚本的前置条件是在未登录状况下执行,如果是在已登录情况下去执行就会执行失败,实际情况下会有很多脚本批量一起执行,就需要去考虑这种登录状态的场景。可以每执行一个脚本就去重置一次,这样就可以确保每次都是初始状态,默认是会都重新重置的,如果不重置的话可以在父类里添加如下属性:
capabilities.setCapability("noReset", true);
添加了上面的声明就不会每次都重置了,因为很多市面上的应用重置后都会出现引导类的界面提示,为了避免每次都需要脚本去处理掉这些引导步骤可以通过上面的设置不重置来确保每次执行数据不会被重置。如果按照上面设置后就需要自己手动去控制处理登录状态,这里我是这样控制的:
package appium.common;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import java.io.File;
import java.net.URL;
public class BasicTestCase {
private AppiumDriver driver;
private Helper helper;
public PageHelper pageHelper;
@BeforeMethod
public void setUp() throws Exception {
File app = new File(System.getProperty("user.dir"), "AUT/osc.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "My Android Device");
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage", "net.oschina.app");
capabilities.setCapability("appActivity", "net.oschina.app.AppStart");
capabilities.setCapability("noReset", true);
capabilities.setCapability("unicodeKeyboard", true);
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
helper = new Helper(driver);
pageHelper = new PageHelper(helper);
//跳转到我的设置页面
pageHelper.getPageCommon().goToMySettingsTab();
//判断是否是登录状态,是的话就退出,不是的话就不做处理
if("aotu12345aotu".equals(pageHelper.getPageMySettings().getNickName())){
pageHelper.getPageMySettings().clickSettingsBtn();
pageHelper.getPageSettings().clickLogout();
}
//回到首页,每个测试脚本的入口就是首页
pageHelper.getPageCommon().goToHomeTab();
}
@AfterMethod
public void tearDown() throws Exception {
driver.quit();
}
}
上面我会通过脚本去切换到我的设置页面,然后判断是否是登录状态,是的话就通过脚本退出,然后在回到首页,这样就可以通过脚本来确保每次都是在未登录状态下。这里有用到了一个设置页面Page类,所以得先抽取下这个页面类,如下:
package appium.pages;
import appium.common.Helper;
import org.openqa.selenium.WebElement;
public class PageSettings {
private Helper helper;
public PageSettings(Helper helper){
this.helper = helper;
}
//抽取退出选项
public WebElement getLogoutItem(){
return helper.findById("net.oschina.app:id/rl_cancle");
}
//抽取关于选项
public WebElement getAboutItem(){
return helper.findById("net.oschina.app:id/rl_about");
}
//点击退出
public void clickLogout(){
helper.click(getLogoutItem());
}
//点击关于
public void clickAbout(){
helper.click(getAboutItem());
}
}
每添加一个Page里记得去PageHelper添加获取这个Page类的方法如下:
private PageSettings pageSettings;
public PageSettings getPageSettings() {
if(pageSettings == null){
pageSettings = new PageSettings(helper);
}
return pageSettings;
}
后续添加Page类也记得来这里添加类似的声明即可。
这样就用脚本处理后登录的状态了,大家可以根据实际的应用特点选择需不需要重置。