編輯:關於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右擊選擇浏覽器打開
樣式效果 1、創建底部的布局layout_footer.xml 2、在自定義的ListView中 初始化話FooterVi
·PreferenceActivity可以顯示一系列Header,每一個Header可以關聯一個Fragment或者Activity。此外,它還可以直接顯示
曾經(或者現在)很多人說起Android和iOS都會拿Android的UI設計來開黑, “你看看人家iOS的設計, 再來看看Android的, 差距怎麼就這麼
1.使用NDK來生成so文件:hello-jni.c函數名Java +包名+函數名字2.修改Android.mk文件LOCAL_SRC_FILES :=hello-jni