Ⅰ appium腳本如何讓點擊一個按鈕無限次數
//代碼如源下 //開始按鈕_點擊操作 功能 開始_點擊() while(1)//表示無限循環 keyboard.keypress(69,1)//按鍵碼,69表示E help.sleep(800)//延時1000=1秒 endwhile 功能結束
Ⅱ Appium進行自動化測試的時候,始終無反應,也沒有日誌輸出,請問什麼原因
1. 啟http伺服器:127.0.0.1:4723 2. 根據測試代碼setUp()進行初始化http伺服器建立session象; 3. 始調用adb找連接設備設置設備id 猜測:我連接模擬器設備呢第二篇文章命令行啟使用-U參數指定某設備我現圖形界面啟沒指定設備 4. 等待設備准備響應命令 相關命令: c1: adb.exe -s emulator-5554 wait-for-device c2: adb.exe -s emulator-5554 shell "echo 'ready'" 5.啟logcat志監控 java -jar appium\node_moles\appium\lib\devices\android\helpers\strings_from_apk.jar aimsi.apk c:\windows\temp\com.example.aimsi 條命令讀取apk文件些apk基本信息json描述我例: { "app_name" : "Aimsi", "menu_settings" : "Settings", "title_activity_main" : "MainActivity", "RbtnImsi" : "漢字", "RtxtImsi" : "IMSI_IMEI" } apk屬性信息文件strings.json存設備目錄: c3:adb.exe -s emulator-5554 push "c:\\windows\\temp\\com.example.aimsi\\strings.json" /data/local/tmp 6.讀取apk安裝情況 c4:adb.exe -s emulator-5554 shell "pm list packages -3 com.example.aimsi" 讀結我前已經安裝apk 7.埠映射發給appium httpserver內容經httpserver直接發給設備 c5:adb.exe -s emulator-5554 forward tcp:4724 tcp:4724 8. 弄appiumjar包設備 c6:adb.exe -s emulator-5554 appium\node_moles\appium\build\android_bootstrap\appiumbootstrap.jar /data/local/tmp 網路bootstrap:Bootstrap 快速發Web應用程序前端工具包CSSHTML集合,使用新瀏覽器技術,給Web發提供尚版式 9.哇k安裝unlock_apk-debug.apk c7:adb.exe -s emulator-5554 install appium\node_moles\appium\build\unlock_apk\unlock_apk-debug.apk apk用解鎖屏幕解鎖apk使其調試我猜者吧運行測試程序候看看手機沒apk知道 10.kill掉所uiautomator進程 c8:adb.exe -s emulator-5554 shell "ps|grep 'uiautomator'" 我模擬器沒啟進程 11.執行bootstrap c9:adb.exe -s emulator-5554 uiautomator runtest appiumbootstrap.jar -c io.appium.android.bootstrap.bootstrap 帝原諒我沒管寫面緊跟著uiautomator輸 12.bootstrap始工作 socket打4724埠appiumsocket伺服器准備緒 載入json,喚醒客戶端 等我想想設備apk--設備bootstrap--pcappium http server--測試程序先姑且猜著吧 13. 所設備運行窗口都輸志文件判斷設備已經解鎖繼續 c10:adb.exe -s emulator-5554 shell "mpsys window" 志文件寫pc:appium\node_moles\appium\.mpsys.log 14.啟測試程序 c11:adb.exe -s emulator-5554 shell "am start -S -n com.example.aimsi/.MainActivity" 15.等待測程序獲焦點處超60s模擬器太慢居讀兩窗口才啟功 16.創建session記初候根據setup提交給appium httpserver東東吧sessionid維持工作隊列bootstrap隊列面取命令執行像知道隊列pc設備我覺像pc; 面些內容沒啥看非步步調用 說啥研究些東西仔細做技術尤其測試技術原則用少搞明白底細遇問題候處理起快 吧
Ⅲ 哪位大神知道怎麼用appium實現引導頁的滑動,並且成功跳轉到主界面
通過獲取屏幕的尺寸大小,然後通過swipe進行滑動,具體代碼如下:
fromappiumimportwebdriver
fromtimeimportsleep
capabilites={
"platformName":"Android",
"platformVersion":"5.1.1",
"deviceName":"aa19503",
"app":"F:\mukewang.apk",
}
driver=webdriver.Remote('
#獲取屏幕寬和高
defget_size():
size=driver.get_window_size()
width=size['width']
height=size['height']
returnwidth,height
#向左滑動
defswipe_left():
x1=get_size()[0]/10*9
y1=get_size()[1]/2
x=get_size()[0]/10
sleep(3)
driver.swipe(x1,y1,x,y1)
swipe_left()
Ⅳ appium+java處理alertDialog失敗
知識點:
1、利用反射,阻止AlertDialog每次的dismiss事件;
在使用AlertDialog的時候,我們設置positive,negative和neutral的button,在點擊之後,即使不手動調用dismiss方法,系統都會自動的幫我們dismiss掉了。
但是我這里可能點擊了之後,還有一些時間比較長的工作處理之後,才能夠dismiss掉此AlertDialog;那麼這就是一個問題了。我們先直接看怎麼來阻止這個系統的dismiss事件。
話不多述,我們直接先上代碼,看看如何操作的,然後在稍微看看源碼,一探究竟:
首先是來一個button,設置點擊事件,彈出dialog
[java]view plain
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.btn_rDialog:
showDialog();
break;
}
}
然後在activity里頭,創建showDialog方法,如下:
[java]view plain
/**
*利用反射,阻止dialog點擊確定或者取消按鈕,總是會使得dialog消失的結果
*/
voidshowDialog(){
AlertDialogalertDialog=newAlertDialog.Builder(this)
.setTitle("title")
.setMessage("content")
.setIcon(R.drawable.__leak_canary_icon)
.setPositiveButton(R.string.ok,
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//就算阻止了dialog的dismiss事件,這里調用dismiss也還是可以dismiss掉dialog的
//dialog.dismiss();
}
})
.setNegativeButton(R.string.cancel,newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
dialog.dismiss();
}
}).create();
alertDialog.setCanceledOnTouchOutside(false);
setDialogCancelable(alertDialog);
//setDialogIsCanceled(alertDialog,false);
/*顯示對話框*/
alertDialog.show();
}
/**
*通過重新設置一個button處理類,達到點擊確定按鈕不dismiss掉dialog的效果
*
*@paramalertDialogalertDialog
*/
voidsetDialogCancelable(AlertDialogalertDialog){
try{
Fieldfield=alertDialog.getClass().getDeclaredField("mAlert");
field.setAccessible(true);
/*獲得mAlert變數的值*/
Objectobj=field.get(alertDialog);
field=obj.getClass().getDeclaredField("mHandler");
field.setAccessible(true);
/*修改mHandler變數的值,使用新的ButtonHandler類*/
field.set(obj,newIButtonHandler(alertDialog));
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*通過獲取mShowing欄位,修改它的值,達到點擊確定按鈕不dismiss掉dialog的效果
*但是好像是沒有用的,不起效果
*
*@paramalertDialogalertDialog
*@=此dialog已經關閉了,反之則是為關閉
*/
voidsetDialogIsCanceled(AlertDialogalertDialog,booleanisCanceled){
try{
/*這里有一個層級關系需要記住,看欄位是屬於父類,還是屬於父類的父類*/
Fieldfield=alertDialog.getClass()
.getSuperclass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
/*將mShowing變數設為false,表示對話框已關閉*/
field.set(alertDialog,isCanceled);
alertDialog.dismiss();
}catch(Exceptione){
e.printStackTrace();
}
}
還有涉及到一個IButtonHandler的類
[java]view plain
packagecom.yaojt.ui.reflect;
importandroid.content.DialogInterface;
importandroid.os.Handler;
importandroid.os.Message;
importjava.lang.ref.WeakReference;
/**
*desc:自定義的dialog點擊按鈕事件處理機制
*<p>
*author:kuyu.yaojt(tanksu)
*<p>
*email:[email protected]
*<p>
*date:17/3/7
*/
{
/*使用弱引用,避免內存泄漏*/
privateWeakReference<DialogInterface>mDialog;
/**
*構造方法
*
*@paramdialogdialog
*/
publicIButtonHandler(DialogInterfacedialog){
mDialog=newWeakReference<>(dialog);
}
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseDialogInterface.BUTTON_POSITIVE:
caseDialogInterface.BUTTON_NEGATIVE:
caseDialogInterface.BUTTON_NEUTRAL:
((DialogInterface.OnClickListener)msg.obj).onClick(mDialog.get(),msg.what);
break;
/**
*AlertController,最終都會調用以下代碼,並且傳入MSG_DISMISS_DIALOG標志
*//
mHandler.obtainMessage(IButtonHandler.MSG_DISMISS_DIALOG,mDialog)
.sendToTarget();
然後到下面代碼
//以下是原始的ButtonHandler類可以看到最後的最後,都會走到這一個入口裡去了
導致所有的dialog方法都會被dismiss掉,只要攔截這個就可以了。做法就是重新定義一個ButtonHandler
設置取代原來的ButtonHandler實例即可。有一點不好那就是會影響到所有的dialog。
但是我們在確定監聽里頭是調用dismiss,是可以dismiss掉dialog的
其實就是不要dismiss的這個方法入口
{
//ButtonclickshaveMessage.whatastheBUTTON{1,2,3}constant
privatestaticfinalintMSG_DISMISS_DIALOG=1;
privateWeakReference<DialogInterface>mDialog;
publicIButtonHandler(DialogInterfacedialog){
mDialog=newWeakReference<>(dialog);
}
@(Messagemsg){
switch(msg.what){
caseDialogInterface.BUTTON_POSITIVE:
caseDialogInterface.BUTTON_NEGATIVE:
caseDialogInterface.BUTTON_NEUTRAL:
((DialogInterface.OnClickListener)msg.obj).onClick(mDialog.get(),msg.what);
break;
caseMSG_DISMISS_DIALOG:
((DialogInterface)msg.obj).dismiss();
}
}
}
*/
}
}
}
代碼就是以上這些,都有注釋的了。
反射確實挺好用的,可以在運行時動態地載入一個類,然後調用執行類裡面的方法,在高級開發中,這個是必須的技能,要好好學習。
另外,這個也是有風險的做法,其他人也可以使用這個來獲取到你的類的相關信息,然後做一些壞事什麼的。
閱讀全文