[英]calabash-android within travis
我正在嘗試在travis中運行calabash-android。 calabash-android在我的機器上運行正常,沒有任何問題。 我有以下travis.yml:
language: android
jdk: oraclejdk8
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
- $HOME/.gradle/daemon
- $HOME/.gradle/native
env:
global:
# wait up to 10 minutes for adb to connect to emulator
- ADB_INSTALL_TIMEOUT=20
- SLAVE_AAPT_TIMEOUT=40
android:
components:
- platform-tools
- tools
- build-tools-23.0.3
- android-23
- extra-android-support
- extra-android-m2repository
- extra-google-m2repository
- sys-img-armeabi-v7a-android-23
before_install:
# install ruby 2.0.0
- rvm install 2.0.0
# install calabash-android
- gem install calabash-android
before_script:
- echo no | android create avd --force --name test --target android-23 --abi armeabi-v7a
- emulator -avd test -no-skin -no-audio -no-window -no-boot-anim &
- android-wait-for-emulator
- adb shell settings put global window_animation_scale 0 &
- adb shell settings put global transition_animation_scale 0 &
- adb shell settings put global animator_duration_scale 0 &
- adb shell input keyevent 82 & #for unlocking as "powerkey"
- sleep 3 # give screen some time to become unlocked
- ./gradlew clean assembleDebug -PdisablePreDex --continue --stacktrace
script:
- calabash-android resign /home/travis/build/app/build/outputs/apk/app-debug.apk
- calabash-android run /home/travis/build/app/build/outputs/apk/app-debug.apk
它與功能的第一種情況一起使用,然后在啟動第二種情況時顯示此錯誤:
App did not start (RuntimeError)
./features/support/app_life_cycle_hooks.rb:5:in `Before'
有任何想法嗎? 或建議?
刪除-no-boot-anim
選項, android-wait-for-emulator
腳本取決於啟動動畫來檢測模擬器何時准備就緒。
我建議這是一個很好的解釋: 檢測何時可以使用模擬器
第二步是等待仿真器完全啟動,因此可以用來運行一些代碼。 原來這是最棘手的部分。 尤其適用於API級別為11+(在撰寫本文時為11-14)的仿真器。
首先,仿真器應連接到adb,並將其列為“脫機”。 在這種狀態下,仿真器不接受任何Shell命令。 在這種狀態下什么也做不了。 這部分通常非常穩定,我還沒有看到啟動模擬器但從未連接到adb的情況。 當然,如果發生某些錯誤,它將不會連接到adb。 因此,此處應使用超時來檢測異常延遲或掛起。
下一狀態設備進入“設備”狀態。 這是設備啟動時。 一旦啟動,設備將進入“在線”狀態。 這是系統開始啟動並且模擬器正常運行的時間。
從設備進入“設備”狀態的那一刻起,可以使用adb shell在設備上執行不同的命令並查詢有關其狀態的一些有用信息。
我發現應該跟蹤幾個屬性,以便可靠地檢測設備何時准備就緒。 第一個屬性稱為dev.bootcompleted。 設備完成啟動后,此屬性將設置為1。
在dev.bootcompleted為1之后,應跟蹤下一個名為sys.boot_completed的屬性。 系統完成啟動后,它將立即設置為1(通常是在發送BOOT_COMPLETED廣播時)。 僅在API級別為9或更高的模擬器上設置此屬性。 在8及更低版本中,永遠不會使用(並且不應跟蹤)此屬性。
但是,即使sys.boot_completed設置為1,仿真器仍未准備就緒。您會注意到引導動畫仍將運行一段時間(很長一段時間)。 只有這樣,UI才會出現。 但幸運的是,也有一種方法可以檢測到此事件。 為此,我們需要跟蹤init.svc.bootanim屬性的值。 此屬性保留啟動動畫服務的狀態,該狀態將在出現UI時立即停止。 換句話說, 一旦init.svc.bootanim的值停止,就可以安全地假定模擬器正在運行並可以使用 。
使用-no-boot-anim
可以在模擬器完全啟動之前stopped
該值:
# Originally written by Ralf Kistner <ralf@embarkmobile.com>, but placed in the public domain
set +e
bootanim=""
failcounter=0
timeout_in_sec=360
until [[ "$bootanim" =~ "stopped" ]]; do
bootanim=`adb -e shell getprop init.svc.bootanim 2>&1 &`
if [[ "$bootanim" =~ "device not found" || "$bootanim" =~ "device offline"
|| "$bootanim" =~ "running" ]]; then
let "failcounter += 1"
echo "Waiting for emulator to start"
if [[ $failcounter -gt timeout_in_sec ]]; then
echo "Timeout ($timeout_in_sec seconds) reached; failed to start emulator"
exit 1
fi
fi
sleep 1
done
echo "Emulator is ready"
現在,我由於第一個場景的工作而感到懷疑(我從未使用過calabash-android),但是我看到它並不依賴於仿真器是否准備就緒:
如果您需要對應用程序進行簽名以匹配您的密鑰庫,則使用辭職。 從GitHub文檔復制https://github.com/calabash/calabash-android/wiki/Running-Calabash-Android
除了辭職,您還可以考慮將調試密鑰庫復制到文件夾中。
apk calabash android運行必須使用與測試服務器相同的密鑰庫進行簽名。
使用命令:
calabash-android resign <apk>
退出您的應用程序。使用calabash-android build構建測試服務器將構建測試服務器,並使用與您正在測試的應用程序相同的密鑰對其進行簽名。
第二種情況是這樣的:
運行測試:
calabash-android run <apk>
Calabash-android在執行應用程序時會與您的應用程序一起安裝檢測工具。 我們稱此工具為“測試服務器”。 “測試服務器”具有特殊的權限,允許它在測試期間與您的應用進行非常緊密的交互。 每當您測試新的二進制文件或使用升級版的calabash時,都會構建新的測試服務器。 測試服務器是一種儀器,它將與設備上的應用程序一起運行以執行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.