appium---封裝appium命令行


  前面我們把簡單的頁面邏輯,定位元素,已經定位方法都封裝好了,但是還不支持一鍵啟動,為什么呢?因為我們還要去打開appium才可以,那我們可以思考下,如果把appium命令行啟動也封裝起來,那是不是真的可以一鍵執行了?實現了自動化?

appium參數配置

在前面的版本中說明了,appium分為客戶端和命令行的,在自動化中想要一鍵執行的話,如果通過客戶端做成一鍵啟動成本有點大,但是可以通過命令行去啟動appium,這樣簡單易實現

appium命令行安裝:appium---命令行啟動appium

這里要提到一點,依然要用到命令行了,那肯定需要了解一些參數。參考地址:Appium 服務命令行參數

命令行參數配置

標志 默認值 描述 例子

--shell

null

進入 REPL 模式

 

--localizable-strings-dir

en.lproj

IOS only: 定位 .strings所在目錄的相對路徑

--localizable-strings-dir en.lproj

--app

null

iOS: 基於模擬器編譯的 app 的絕對路徑或者設備目標的 bundle_id; Android: apk 文件的絕對路徑--app /abs/path/to/my.app

 

--ipa

null

(IOS-only) .ipa 文件的絕對路徑

--ipa /abs/path/to/my.ipa

-U--udid

null

連接物理設備的唯一設備標識符

--udid 1adsf-sdfas-asdf-123sdf

-a--address

0.0.0.0

監聽的 ip 地址

--address 0.0.0.0

-p--port

4723

監聽的端口

--port 4723

-ca--callback-address

null

回調IP地址 (默認: 相同的IP地址)

--callback-address 127.0.0.1

-cp--callback-port

null

回調端口號 (默認: 相同的端口號)

--callback-port 4723

-bp--bootstrap-port

4724

(Android-only) 連接設備的端口號

--bootstrap-port 4724

-k--keep-artifacts

false

棄用,無效。trace信息現在保留tmp目錄下,每次運行前會清除該目錄中的信息。 也可以參考 –trace-dir 。

 

-r--backend-retries

3

(iOS-only) 遇到 crash 或者 超時,Instrument 重新啟動的次數。

--backend-retries 3

--session-override

false

允許 session 被覆蓋 (沖突的話)

 

--full-reset

false

(iOS) 刪除整個模擬器目錄。 (Android) 通過卸載應用(而不是清除數據)重置應用狀態。在 Android 上,session 完成后也會刪除應用。

 

--no-reset

false

session 之間不重置應用狀態 (iOS: 不刪除應用的 plist 文件; Android: 在創建一個新的 session 前不刪除應用。)

 

-l--pre-launch

false

在第一個 session 前,預啟動應用 (iOS 需要 –app 參數,Android 需要 –app-pkg 和 –app-activity)

 

-lt--launch-timeout

90000

(iOS-only) 等待 Instruments 啟動的時間

 

-g--log

null

將日志輸出到指定文件

--log /path/to/appium.log

--log-level

debug

日志級別; 默認 (console[:file]): debug[:debug]

--log-level debug

--log-timestamp

false

在終端輸出里顯示時間戳

 

--local-timezone

false

使用本地時間戳

 

--log-no-colors

false

不在終端輸出中顯示顏色

 

-G--webhook

null

同時發送日志到 HTTP 監聽器

--webhook localhost:9876

--native-instruments-lib

false

(IOS-only) iOS 內建了一個怪異的不可能避免的延遲。我們在 Appium 里修復了它。如果你想用原來的,你可以使用這個參數。

 

--app-pkg

null

(Android-only) 你要運行的apk的java包。 (例如, com.example.android.myApp)

--app-pkg com.example.android.myApp

--app-activity

null

(Android-only) 打開應用時,啟動的 Activity 的名字(比如, MainActivity)

--app-activity MainActivity

--app-wait-package

false

(Android-only) 你想等待的 Activity 的包名。(比如, com.example.android.myApp)

--app-wait-package com.example.android.myApp

--app-wait-activity

false

(Android-only) 你想等待的 Activity 名字(比如, SplashActivity)

--app-wait-activity SplashActivity

--android-coverage

false

(Android-only) 完全符合條件的 instrumentation 類。 作為命令 adb shell am instrument -e coverage true -w 的 -w 的參數

--android-coverage com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation

--avd

null

(Android-only) 要啟動的 avd 的名字

 

--avd-args

null

(Android-only) 添加額外的參數給要啟動avd

--avd-args -no-snapshot-load

--device-ready-timeout

5

(Android-only) 等待設備准備好的時間,以秒為單位

--device-ready-timeout 5

--safari

false

(IOS-Only) 使用 Safari 應用

 

--device-name

null

待使用的移動設備名字

--device-name iPhone Retina (4-inch), Android Emulator

--platform-name

null

移動平台的名稱: iOS, Android, or FirefoxOS

--platform-name iOS

--platform-version

null

移動平台的版本

--platform-version 7.1

--automation-name

null

自動化工具的名稱: Appium or Selendroid

--automation-name Appium

--browser-name

null

移動瀏覽器的名稱: Safari or Chrome

--browser-name Safari

--default-device-dd

false

(IOS-Simulator-only) 使用instruments自己啟動的默認模擬器

 

--force-iphone

false

(IOS-only) 無論應用要用什么模擬器,強制使用 iPhone 模擬器

 

--force-ipad

false

(IOS-only) 無論應用要用什么模擬器,強制使用 iPad 模擬器

 

--language

null

iOS / Android 模擬器的語言

--language en

--locale

null

Locale for the iOS simulator / Android Emulator

--locale en_US

--calendar-format

null

(IOS-only) iOS 模擬器的日歷格式

--calendar-format gregorian

--orientation

null

(IOS-only) 初始化請求時,使用 LANDSCAPE (橫屏) 或者 PORTRAIT (豎屏)

--orientation LANDSCAPE

--tracetemplate

null

(IOS-only) 指定 Instruments 使用的 tracetemplate 文件

--tracetemplate /Users/me/Automation.tracetemplate

--show-sim-log

false

(IOS-only) 如果設置了, iOS 模擬器的日志會寫到終端上來

 

--show-ios-log

false

(IOS-only) 如果設置了, iOS 系統的日志會寫到終端上來

 

--nodeconfig

null

指定 JSON 格式的配置文件 ,用來在 selenium grid 里注冊 appiumd

--nodeconfig /abs/path/to/nodeconfig.json

-ra--robot-address

0.0.0.0

robot 的 ip 地址

--robot-address 0.0.0.0

-rp--robot-port

-1

robot 的端口地址

--robot-port 4242

--selendroid-port

8080

用來和 Selendroid 交互的本地端口

--selendroid-port 8080

--chromedriver-port

9515

ChromeDriver運行的端口

--chromedriver-port 9515

--chromedriver-executable

null

ChromeDriver 可執行文件的完整路徑

 

--use-keystore

false

(Android-only) 設置簽名 apk 的 keystore

 

--keystore-path

(Android-only) keystore 的路徑

 

 

--keystore-password

android

(Android-only) keystore 的密碼

 

--key-alias

androiddebugkey

(Android-only) Key 的別名

 

--key-password

android

(Android-only) Key 的密碼

 

--show-config

false

打印 Appium 服務器的配置信息,然后退出

 

--no-perms-check

false

跳過Appium對是否可以讀/寫必要文件的檢查

 

--command-timeout

60

默認所有會話的接收命令超時時間 (在超時時間內沒有接收到新命令,自動關閉會話)。 會被新的超時時間覆蓋

 

--keep-keychains

false

(iOS) 當 Appium 啟動或者關閉的時候,是否保留 keychains (Library/Keychains)

 

--strict-caps

false

如果所選設備是appium不承認的有效設備,會導致會話失敗

 

--isolate-sim-device

false

Xcode 6存在一個bug,那就是一些平台上如果其他模擬器設備先被刪除時某個特定的模擬器只能在沒有任何錯誤的情況下被建立。這個選項導致了Appium不得不刪除除了正在使用設備以外其他所有的設備。請注意這是永久性刪除,你可以使用simctl或xcode管理被Appium使用的設備類別。

 

--tmp

null

可以被Appium用來管理臨時文件的目錄(絕對路徑),比如存放需要移動的內置iOS應用程序。 默認的變量為 APPIUM_TMP_DIR ,在 *nix/Mac 為 /tmp 在windows上使用環境便令 TEMP 設定的目錄。

 

--trace-dir

null

用於保存iOS instruments trace的 appium 目錄,是絕對路徑, 默認為 /appium-instruments

 

--intent-action

android.intent.action.MAIN

(Android-only) 用於啟動 activity 的intent action

--intent-action android.intent.action.MAIN

--intent-category

android.intent.category.LAUNCHER

(Android-only) 用於啟動 activity 的intent category

--intent-category android.intent.category.APP_CONTACTS

--intent-flags

0x10200000

(Android-only) 啟動 activity 的標志

--intent-flags 0x10200000

--intent-args

null

(Android-only) 啟動 activity 時附帶額外的 intent 參數

--intent-args 0x10200000

--suppress-adb-kill-server false (Android-only) 如果被設定,阻止Appium殺掉adb實例。

 

 

封裝appium

1、封裝Dos命令

因為appium命令啟動需要依賴於Dos命令,這里先把Dos命令封裝進來,這里加上了獲取設備信息,后面我們需要傳入到appium中,這里封裝了三種方法。

# coding:utf-8
# dos_cmd.py
import os class Dos_adb: def get_adb_result(self,command): ''' :param command: Dos中輸入內容 :return: 返回解決內容 ''' adb_result = os.popen(command).read().split('\n') return adb_result def get_device(self): ''' 獲取到設備信息 ''' xx = Dos_adb() devices = [] result_list = xx.get_adb_result('adb devices') result = [x for x in result_list if x != ''] if len(result)>1: for i in result: if 'List' in i: continue de = i.split('\tdevice') devices.append(de[0]) return devices else: return None def get_adb(self,command): ''' 執行adb 命令: ''' os.system(command) if __name__ == '__main__': x= Dos_adb() x.get_adb_result('appium')

2、封裝appium讀取設備信息

這里也直接把設備信息全部封裝進來了,如果多設備的話就不能這樣寫了。這里也可以把設備信息封裝在yaml中,方法不唯一。

# coding:utf-8
# appium_start.py
from appium import webdriver from common.dos_cmd import Dos_adb import os path =os.path.dirname(os.getcwd())
# appium日志路徑 appium_log
= os.path.join(os.path.join(path,'logs'),'appium_log.txt') class Appium_start(): def Android_device(self): '''啟動app''' desired_caps = { 'platformName': 'Android', # 測試版本 'platformVersion': '5.1.1', # 系統版本 "appPackage": "com.taobao.taobao", # app包名 "appActivity": "com.ali.user.mobile.login.ui.UserLoginActivity", # 啟動launch Activity "noReset": True, # 不清空數據 "unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串 "resetKeyboard": True, # 鍵盤隱藏起來 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) return driver def start(self): ''' 啟動appium ''' adb = Dos_adb() devices = adb.get_device()[0] a = 'appium -p 4723 -U '+devices +' --log %s' %appium_log adb.get_adb(a) if __name__ == '__main__': xx = Appium_start() xx.start() xx.Android_device()

3、執行用例

這里我們在前面的封裝用例的基礎上進行了更改,把封裝的appium通過多線程的方法進行執行。

# coding:utf-8
# start_login.py

from pages.login_page import LoginPage
import time
import os
from common.appium_start import Appium_start
import threading
path  =os.path.dirname(os.getcwd())
# 獲取到yaml文件路徑
yaml_path = os.path.join(os.path.join(path,'config'),'element.yaml')
class BaseDriver:
    def login(self,driver):
            page =LoginPage(driver)
            time.sleep(8)
            # 獲取用戶名元素以及輸入內容
            use = page.get_username_element(yaml_path)
            use.send_keys('1111')
            # 獲取密碼元素以及輸入內容
            pas = page.get_password_element(yaml_path)
            pas.send_keys('22222')
            # 進行點擊登錄
            button = page.get_login_button_element(yaml_path)
            button.click()

if __name__ == '__main__':
    t2 = threading.Thread(target=Appium_start().start)
    t2.start()
    time.sleep(20)
    xx= Appium_start().Android_device()
    t1 = threading.Thread(target=BaseDriver().login(xx))
    t1.start()

這里需要注意的是我們通過代碼啟動appium的過程中需要用到多線程,因為appium啟動完成后,沒有辦法進行繼續執行其他的代碼

 

 

感謝您的關注,哪里不懂的可以下方留言,看到后第一時間回復

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM