前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Appium系列|测试脚本实现(一)

Appium系列|测试脚本实现(一)

作者头像
测试邦
发布2019-07-24 14:17:40
1.2K0
发布2019-07-24 14:17:40
举报
文章被收录于专栏:测试邦测试邦

登录权限校验脚本实现

上一章节对测试框架进行了封装,这个章节主要来详细介绍下具体的脚本实现。

比如现在要实现如下一个用例:

  1. 在未登录情况下,点击底部导航栏“我的”,切换到我的设置页面
  2. 在我的设置页面分别点击“我的消息”、“我的博客”、“我的活动”、“我的团队”
  3. 校验都会跳转到登录页面

自动化的实现之前我们介绍过可以大概分为三个步骤,控件定位、控件操作、校验点编写,前两个步骤我们上面的章节介绍得差不多了,关于校验点的编写也很简单,可以通过单元测框架如TestNG提供的断言种类来进行,如断定某个东西为真或者假、某两个东西是相等或者不等、某个东西是否为空等,单元测试框架都有提供对应的断言方法来进行断言。

我们这用例检验点是主要是来断定登录界面要被打开,我们可以封装如下方法返回一个布尔值要来得到当前的登录页面是否被打开:

在PageLogin类里面添加如下方法(上面已经有封装过,这边直接摘取出来),

代码语言:javascript
复制
 //判断是否登录界面打开的方法
    public boolean isLoginScreenOpened(){
        boolean result = false;
        if(getLoginBtn() != null){
            return getLoginBtn().isDisplayed();
        }
        return result;
    }

这里是通过判断登录按钮是否显示来进行判断的,当然也可以有其他方式来进行校验,大家可以选择一个合适的校验方式都可以。

这时候我可以来实现这个脚本(新建一个包,如testcase.login):

代码语言:javascript
复制
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. 切换到我的设置页面,点击登录按钮
  2. 输入用户名: 735723619@qq.com
  3. 输入密码: 12345678
  4. 点击登录按钮
  5. 校验可以成功登录

步骤1~4通过之前Page类的抽取都能覆盖到,这时候看下步骤5,成功登录可以先手动登录下,然后摘取可以要来校验的点,这里我通过校验登录后的昵称是否和预期的一致来作为校验成功的验证点,因为登录成功的界面也是在我的设置页面,所以打开PageMySettings页面类,然后看到有封装了如下的方法用获取昵称的文本值:

代码语言:javascript
复制
//封装获取昵称文本的方法
    public String getNickName(){
        return helper.getText(getNickNameTextView());
    }

这时候就可以具体来实现这个用例,一样是通过PageHelper的对象引用来调用需要的Page类,进而调用封装好的方法,代码如下:

代码语言:javascript
复制
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());
    }
}

执行下这个脚本,就可以看到脚本是通过的。

这个脚本的前置条件是在未登录状况下执行,如果是在已登录情况下去执行就会执行失败,实际情况下会有很多脚本批量一起执行,就需要去考虑这种登录状态的场景。可以每执行一个脚本就去重置一次,这样就可以确保每次都是初始状态,默认是会都重新重置的,如果不重置的话可以在父类里添加如下属性:

代码语言:javascript
复制
 capabilities.setCapability("noReset", true);

添加了上面的声明就不会每次都重置了,因为很多市面上的应用重置后都会出现引导类的界面提示,为了避免每次都需要脚本去处理掉这些引导步骤可以通过上面的设置不重置来确保每次执行数据不会被重置。如果按照上面设置后就需要自己手动去控制处理登录状态,这里我是这样控制的:

代码语言:javascript
复制
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类,所以得先抽取下这个页面类,如下:

代码语言:javascript
复制
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类的方法如下:

代码语言:javascript
复制
 private PageSettings pageSettings;

  public PageSettings getPageSettings() {
        if(pageSettings == null){
            pageSettings = new PageSettings(helper);
        }
        return pageSettings;
    }

后续添加Page类也记得来这里添加类似的声明即可。

这样就用脚本处理后登录的状态了,大家可以根据实际的应用特点选择需不需要重置。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试邦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正确账号信息可以成功登录脚本实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档