上一篇文章介紹安裝appium測試環境,這一片研究介紹如何測試Android自動化。html
上一篇地址:《【Mac + Appium學習(一)】之安裝Appium環境》node
這一篇參考:《Mac 下 appium 自動化測試 Android 測試配置和腳本編寫(四)》python
若是報錯:參考上一篇解決辦法(第二節第6小點)android
參數配置以下: 參考《Mac 下 appium 自動化測試 Android 測試配置和腳本編寫(四)》web
其中,appPackage、appActivity如何獲取呢(有坑):shell
參考:《獲取app的 appPackage和appActivity》session
輸入以下:app
$ adb shell shell@R9s:/ $ dumpsys activity | grep mFocusedActivity mFocusedActivity: ActivityRecord{f8dacd9 u0 cn.sqm.citymine_safety/.LoginActivity(這塊有問題,見下面) t64}
其中:cn.sqm.citymine_safety/.LoginActivity是咱們須要的ide
能夠點擊【Save As】進行保存post
而後點擊【Start Session】按鈕。
可是報錯:An unknown server-side error occurred while processing the command. Original error: Error occured while starting App. Original error: Permission to start activity denied.
經查詢得知是:appActivity這塊的問題
《Error occured while starting App. Original error: Permission to start activity denied.錯誤的解決方法》
解決以下,命令行輸入:
adb shell dumpsys activity activities >/Users/xxx/Desktop/activity.txt
打開文檔,以下:
修改後再一次運行,會打開The Inspector:
檢查器是應用程序狀態的可視化表示具備在應用程序中執行某些交互的能力Appium。
可是有一個問題是,之後每次啓動都要安裝setting和unlock app,爲了解決,以下:
《關掉appium setting 和unlock自動安裝的方法》*
==========================================================
下面兩個由於不是在appium-desktop下修改的,因此對本文不適。
①《MacBook Appium 禁止每次運行都會啓動appium setting 、appium unlock》
②《appium解決每次運行都須要安裝Unlock以及AppiumSetting的問題》
==========================================================
從網上找了不少修改的方法可是統一都在appium下的android-helpers.js修改,屢試不爽,通過查詢得知應該在appium-desktop下修改,多是由於我用的是這個軟件吧:
它的路徑爲:
# 修改android-helpers.js
open
/Applications/Project/Appium1.7.1.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/lib
打開android-helpers.js文件
await adb.install(unicodeIMEPath, false);
如圖:
await helpers.pushSettingsApp(adb);
await helpers.pushUnlock(adb);
這個文件就算改完了,保存並退出。
# 修改android-helpers.js
open /Applications/Project/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/build/lib/
// return _regeneratorRuntime.awrap(adb.install(_appiumAndroidIme.path, false)); return context$1$0.abrupt('return',defaultIME);
// return _regeneratorRuntime.awrap(helpers.pushSettingsApp(adb)); return context$1$0.abrupt('return',defaultIME); // return _regeneratorRuntime.awrap(helpers.pushUnlock(adb)); return context$1$0.abrupt('return',defaultIME);
ok,保存而且退出。重啓appium-desktop便可。不會再無休止地讓你安裝Unlock和AppiumSetting了。
寫一下簡易的代碼以下:
desired_capabilities.py
def get_desired_capabilities(): desired_caps = { "platformName": "Android", "platformVersion": "6.0.1", "deviceName": "OPPO", "appPackage": "cn.sqm.citymine_safety", "appActivity": ".activity.LauncherActivity", "udid": "608ad0fe" } return desired_caps def get_uri(): return 'http://localhost:4723/wd/hub'
test.py
from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import unittest import time from time import sleep import Mine.Appium.desired_capabilities as desired_capabilities from selenium.webdriver.common.by import By class AndroidTest(unittest.TestCase): @classmethod def setUpClass(self): desired_cap = desired_capabilities.get_desired_capabilities() uri = desired_capabilities.get_uri() self.d = webdriver.Remote(uri,desired_cap) @classmethod def tearDownClass(self): sleep(10) self.driver.quit() pass def setUp(self): print("=======start!=======") sleep(5) size = self.d.get_window_size() print(size) # 輸入用戶名 userName = self.d.find_element(By.ID,"cn.sqm.citymine_safety:id/et_login_id") userName.send_keys("xxx") # 輸入密碼 password = self.d.find_element(By.ID,"cn.sqm.citymine_safety:id/et_login_password") password.send_keys("xxx") # 登陸密碼 button = self.d.find_element(By.ID,"cn.sqm.citymine_safety:id/btn_login") button.click() def tearDown(self): print("=======stop!=======") def test1(self): print("測試開始!") # 發起任務 self.d.find_element_by_id("cn.sqm.citymine_safety:id/rl_add_task").click() # 任務類型 self.d.find_element_by_id("cn.sqm.citymine_safety:id/tv_select_task_type").click() self.d.swipe(534, 1630, 534, 1583, 500) # 向上拖動 self.d.swipe(500, 1270, 500, 500, 500) # 獲取值 text = self.d.find_element_by_id("cn.sqm.citymine_safety:id/tv_get_location").text self.assertEqual(text,"公園1","定位不對!") if __name__=='__main__': unittest.main()
可是報錯:
selenium.common.exceptions.WebDriverException: Message: Parameters were incorrect. We wanted {"required":["value"]} and you sent ["text","value","id","sessionId"]
解決參考以下:
《appium+webdriveragent+Python+真機/模擬器 app自動化測試》
找到緣由是selenium版本的問題,把selenium版本降到3.0.1 就能夠了,執行命令以下:
# 查看命令: pip show selenium //查看當前包的版本信息 # 卸載命令: pip uninstall selenium //卸載當前安裝的包 # 安裝命令: pip install selenium==3.0.1 //指定版本號安裝 # 查看命令: pip show selenium //查看當前包的版本信息
可是再一次執行appium程序時又遇到以下報錯:
ImportError: cannot import name 'InvalidArgumentException'
參考解決以下:《執行appium程序時遇到以下報錯,ImportError: cannot import name 'InvalidArgumentException'》
在此路徑下的exceptions.py文件中添加一段代碼:
/Users/xxx/.pyenv/versions/3.6.1/lib/python3.6/site-packages/selenium/common/exceptions.py
class InvalidArgumentException(WebDriverException): """ """ pass