編輯:關於Android編程
之前在這篇文章有寫過一個例子,但是這個例子只實現了登錄功能,封裝還是不好的,也不能多個用例執行,現在來用上一篇文章封裝之後的方法來寫實例。封裝和例子代碼已打包在底部有鏈接
測試app: 守護2.2.4
appium: 1.4.16
os: win10
android: 小米note,android6.0
打開app,到達歡迎界面,點擊登錄,輸入帳號密碼,登錄,判斷是否登錄成功。
邏輯注意點:
第一次打開會彈出引導頁面,這個頁面是另一個Activity:AboutActivity 已經登錄過了,就會直接到首頁 第一次到首頁,會有一個dialog,這個會擋住首頁在pages目錄下新建LoginPage.java,繼承PageAppium,實現登錄的界面的控件獲取和存放id值
package com.example.pages;
import com.example.base.PageAppium;
import java.util.List;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
/**
* ui界面類,界面在這裡處理
* Created by LITP on 2016/9/22.
*/
public class LoginPage extends PageAppium {
//登錄界面的登錄按鈕
public final String LOGIN_BUTTON_ID = "login_btn_login";
//第一屏的登錄按鈕
public final String WELCOME_LOGIN_BUTTON_ID = "welcome_login_btn";
//成功登錄到首頁標識
public final String INDEX_TEXT = "首頁";
//是否在關於屏標識
public final String ABOUT_TEXT = "AboutActivity";
//關於頁面的按鈕id
public final String ABOUT_BUTTON_ID = "about_go_button";
//帳號密碼控件
public final String NAME_PASS_ELEMENT = "android.widget.EditText";
//首頁控件
public final String INDEX_ELEMENT = "tl_index";
//登錄完成之後的activity名字
public final String INDEX_ACTIVITY_NAME = "IndexActivity";
public LoginPage(AndroidDriver driver){
super(driver);
}
/**
* 是否在歡迎界面
*/
public boolean isWelcome(){
return isIdElementExist(WELCOME_LOGIN_BUTTON_ID,3,true);
}
/**
* 獲取關於界面的activity的名字
* @return
*/
public String getAboutText(){
return ABOUT_TEXT;
}
/**
* 獲取關於界面的按鈕
* @return
*/
public AndroidElement getAboutButton(){
return waitAutoById(ABOUT_BUTTON_ID);
}
public AndroidElement getWelcmoeLoginButton(){
return findById(WELCOME_LOGIN_BUTTON_ID);
}
public AndroidElement getLoginButton(){
return findById(LOGIN_BUTTON_ID);
}
/**
* 獲取賬號密碼框的控件
* @return
*/
public List getNamePassElement(){
return getManyElementByClassName(NAME_PASS_ELEMENT,2);
}
/**
* 首頁標識,是否成功登錄
* @return
*/
public boolean getIndexflag(){
/*AndroidElement element = waitAutoByXp(LoginPage.INDEX_TEXT);
return element != null;*/
AndroidElement element = findById(INDEX_ELEMENT);
return element != null;
}
/**
* 獲取首頁的一個元素,讓操作程序等待
*/
public String getIndexElementId(){
return INDEX_ELEMENT;
}
/**
* 獲取首頁的一個元素,讓操作程序等待
*/
public AndroidElement getIndexElement(){
return findById(INDEX_ELEMENT);
}
public String getIndexActivity(){
return INDEX_ACTIVITY_NAME;
}
}
在cases目錄下新建Login.java,繼承InitAppium,實現用例的初始化操作
package com.example.cases;
import com.example.base.Assertion;
import com.example.base.InitAppium;
import com.example.operation.LoginOperate;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* 登錄測試用例
* Created by LITP on 2016/9/22.
*/
public class Login extends InitAppium {
private LoginOperate loginOperate;
@BeforeClass
public void initDriver(){
Assert.assertNotNull(driver);
loginOperate = new LoginOperate(driver);
}
/**
* 測試帳號對 密碼不對情況
*/
@Test(priority = 0)
public void loginErrorUser(){
boolean flag = loginOperate.login("13192624740","iuhihj");
Assertion.verifyEquals(flag,true,"帳號對密碼錯誤是否登錄成功");
print("帳號密碼不對情況登錄:"+ flag);
}
/**
* 測試帳號密碼規格不對情況
*/
@Test(priority = 1)
public void loginErrorNum(){
boolean flag = loginOperate.login("1319262asdfsddsasdfsdfsdfsdfsdfsdf4740","dfgd#@$1234fgdsfgdsgdffds");
Assertion.verifyEquals(flag,true,"帳號密碼格式不對是否登錄成功");
print("帳號密碼格式不對情況登錄:"+ flag);
}
/**
* 測試帳號密碼為中文情況
*/
@Test(priority = 2)
public void loginChinese(){
boolean flag = loginOperate.login("帳號","密碼");
Assertion.verifyEquals(flag,true,"帳號密碼為中文是否登錄成功");
print("帳號密碼為中文情況登錄:"+ flag);
}
/**
* 測試帳號密碼為空情況
*/
@Test(priority = 3)
public void loginEmpty(){
boolean flag = loginOperate.login("","");
Assertion.verifyEquals(flag,true,"帳號密碼為空是否登錄成功");
print("帳號密碼為空情況登錄:"+ flag);
}
/**
* 測試帳號密碼正確情況
*/
@Test(priority = 4)
public void loginConfim() {
boolean flag = loginOperate.login("13192624740","xxxxxx");
print("帳號密碼對的情況登錄:"+ flag);
Assert.assertTrue(flag,"帳號密碼對的情況登錄");
}
}
實現用例的登錄邏輯,繼承OperateAppium
package com.example.operation;
import com.example.base.OperateAppium;
import com.example.pages.LoginPage;
import io.appium.java_client.android.AndroidDriver;
/**
* 登錄邏輯處理
* Created by LITP on 2016/9/23.
*/
public class LoginOperate extends OperateAppium {
private LoginPage loginPage;
AndroidDriver driver;
public LoginOperate(AndroidDriver driver){
super(driver);
loginPage = new LoginPage(driver);
this.driver = driver;
}
/**
* 傳遞帳號密碼
* @param name 帳號
* @param pass 密碼
* @return 是否成功登錄到主頁
*/
public boolean login(String name,String pass){
sleep(1000);
//是否在歡迎頁面
if(getCurrActivity().equals(loginPage.getAboutText())){
print("關於界面");
for(int i=0; i<4; i++){
swipeToLeft(300);
sleep(500);
}
clickView(loginPage.getAboutButton());
//點擊歡迎頁面的登錄
clickView(loginPage.getWelcmoeLoginButton());
//在歡迎界面
}else if(loginPage.isWelcome()){
print("點擊登錄");
clickView(loginPage.getWelcmoeLoginButton());
}else if(loginPage.getLoginButton() == null){//自動登錄了就輸出成功,返回
print("自動登錄了,返回,執行注銷");
return true;
}
//輸入內容
inputManyText(name,pass);
//點擊登錄
clickView(loginPage.getLoginButton());
//等待到首頁
waitAutoById(loginPage.getIndexElementId());
//如果在登錄完的界面沒有第一屏就點擊一下中間,關閉引導屏
if(loginPage.getIndexElement() == null &&
getCurrActivity().equals(loginPage.getIndexActivity())){
press();
}
//返回是否成功到主頁
return loginPage.getIndexflag();
}
}
在這個測試module根目錄下創建testng_login.xml文件,輸入下面的內容右鍵run運行就是運行用例了,不懂的看之前的文章
這個我打包了,最重要的一點就是修改用戶資料之前得先調用 正確的帳號密碼登錄
@Test
public void Login() {
//這裡先登錄,
boolean flag = loginOperate.login("13192624740", "xxxxxx");
//斷言是否成功登錄,登錄成功才修改資料
Assert.assertTrue(flag);
}
testng自身帶有測試報告,但是內容難以觀看理解,所以這裡利用了ReportNg
這個包是經過修改的,支持中文,放到測試的module的libs文件夾,右鍵add as library,不懂的看前面的文章,
修改剛剛的testng_login.xml ,添加了listeners,再次運行這個xml,在module目錄下就會看到有test-output測試報告的文件夾,有html和xml格式的
在index.html右擊選擇浏覽器打開




Android學習(45) -- 自定義控件(9) 下拉刷新 (添加footer)
樣式效果 1、創建底部的布局layout_footer.xml 2、在自定義的ListView中 初始化話FooterVi
PreferenceActivity源碼分析與簡單應用
·PreferenceActivity可以顯示一系列Header,每一個Header可以關聯一個Fragment或者Activity。此外,它還可以直接顯示
Android之自定義Transition動畫
曾經(或者現在)很多人說起Android和iOS都會拿Android的UI設計來開黑, “你看看人家iOS的設計, 再來看看Android的, 差距怎麼就這麼
Android NDK 生成以及調用so 文件
1.使用NDK來生成so文件:hello-jni.c函數名Java +包名+函數名字2.修改Android.mk文件LOCAL_SRC_FILES :=hello-jni