I can't tell if the issue is coming from appium, from appium_capybara, or from selendroid
At the end of the test suite, which is all green, the app in the emulator closes and reopen. I checked appium log and there is a strange Resetting app mid-session
which come just after my last assertion, followed by re-installing and re-starting the app.
debug: Proxying command to localhost:8080
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/f6ee70cd-9355-76d0-5495-42a57f594220/element/:wdc:1407460168895/text","method":"GET"}
debug: Proxied response received with status 200: "{\"value\":\"Je souhaites creer un compte.\",\"status\":0,\"sessionId\":\"f6ee70cd-9355-76d0-5495-42a57f594220\"}"
info: <-- GET /wd/hub/session/f6ee70cd-9355-76d0-5495-42a57f594220/element/:wdc:1407460168895/text 200 139.051 ms - 103
info: --> POST /wd/hub/session/f6ee70cd-9355-76d0-5495-42a57f594220/appium/app/reset {}
debug: Resetting app mid-session
debug: Running generic full reset
info: Shutting down appium session
debug: Stopping selendroid server
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/f6ee70cd-9355-76d0-5495-42a57f594220","method":"DELETE"}
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "am force-stop com.rhomobile.myapp"
debug: Stopping logcat capture
debug: Logcat terminated with code null, signal SIGTERM
debug: Cleaning up appium session
debug: Restarting app
debug: No appActivity desired capability or server param. Parsing from apk.
debug: No appPackage desired capability or server param. Parsing from apk.
debug: Using local app from desired caps: /workspace/my_app/bin/target/android/MyApp-debug.apk
debug: Creating new appium session 413e0ac7-d863-47d5-8009-8b076a72040f
debug: Starting selendroid server
debug: Checking whether selendroid is built yet
debug: Selendroid server exists!
debug: Preparing device for session
debug: Checking whether app is actually present
debug: Checking whether adb is present
debug: Using adb from /opt/android-sdk-linux/platform-tools/adb
info: Retrieving device
debug: Trying to find a connected android device
debug: Getting connected devices...
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" devices
debug: 1 device(s) connected
info: Found device emulator-5554
debug: Setting device id to emulator-5554
debug: Waiting for device to be ready and to respond to shell commands (timeout = 5)
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 wait-for-device
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "echo 'ready'"
debug: Starting logcat capture
debug: Checking whether aapt is present
debug: Using aapt from /opt/android-sdk-linux/build-tools/19.1.0/aapt
debug: hasInternetPermissionFromManifest: "/opt/android-sdk-linux/build-tools/19.1.0/aapt" dump badging /workspace/my_app/bin/target/android/MyApp-debug.apk
debug: Parsing package and activity from app manifest
debug: Checking whether aapt is present
debug: Using aapt from /opt/android-sdk-linux/build-tools/19.1.0/aapt
debug: packageAndLaunchActivityFromManifest: "/opt/android-sdk-linux/build-tools/19.1.0/aapt" dump badging /workspace/my_app/bin/target/android/MyApp-debug.apk
debug: badging package: com.rhomobile.myapp
debug: badging act: com.rhomobile.rhodes.RhodesActivity
debug: Parsed package and activity are: com.rhomobile.myapp/com.rhomobile.rhodes.RhodesActivity
debug: Rebuilt selendroid server already exists, no need to rebuild it with a new manifest
debug: Checking signed status of /tmp/selendroid.com.rhomobile.myapp.apk
debug: Checking app cert for /tmp/selendroid.com.rhomobile.myapp.apk: java -jar "/.npm/lib/node_modules/appium/node_modules/appium-adb/jars/verify.jar" "/tmp/selendroid.com.rhomobile.myapp.apk"
debug: Checking signed status of /workspace/my_app/bin/target/android/MyApp-debug.apk
debug: Checking app cert for /workspace/my_app/bin/target/android/MyApp-debug.apk: java -jar "/.npm/lib/node_modules/appium/node_modules/appium-adb/jars/verify.jar" "/workspace/my_app/bin/target/android/MyApp-debug.apk"
debug: App already signed.
debug: Zip-aligning /tmp/selendroid.com.rhomobile.myapp.apk
debug: Checking whether zipalign is present
debug: Using zipalign from /opt/android-sdk-linux/build-tools/19.1.0/zipalign
debug: zipAlignApk: "/opt/android-sdk-linux/build-tools/19.1.0/zipalign" -f 4 "/tmp/selendroid.com.rhomobile.myapp.apk" "/tmp/appium11478-19033-iejuaa.tmp"
debug: App already signed.
debug: Zip-aligning /workspace/my_app/bin/target/android/MyApp-debug.apk
debug: Checking whether zipalign is present
debug: Using zipalign from /opt/android-sdk-linux/build-tools/19.1.0/zipalign
debug: zipAlignApk: "/opt/android-sdk-linux/build-tools/19.1.0/zipalign" -f 4 "/workspace/my_app/bin/target/android/MyApp-debug.apk" "/tmp/appium11478-19033-u4uq6l.tmp"
debug: Rebuilt selendroid apk does not exist, uninstalling any instances of it on device to make way for new one
debug: Uninstalling com.rhomobile.myapp.selendroid
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "am force-stop com.rhomobile.myapp.selendroid"
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 uninstall com.rhomobile.myapp.selendroid
debug: App was uninstalled
debug: Getting install status for com.rhomobile.myapp.selendroid
debug: Getting device API level
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "getprop ro.build.version.sdk"
debug: Device is at API Level 19
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "pm list packages -3 com.rhomobile.myapp.selendroid"
debug: App is not installed
debug: Rebuilt selendroid is not installed, installing it
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 install -r "/tmp/selendroid.com.rhomobile.myapp.apk"
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "getprop persist.sys.language"
debug: Current device language: en
debug: java -jar "/.npm/lib/node_modules/appium/node_modules/appium-adb/jars/appium_apk_tools.jar" "stringsFromApk" "/workspace/my_app/bin/target/android/MyApp-debug.apk" "/tmp/com.rhomobile.myapp" en
debug: No strings.xml for language 'en', getting default strings.xml
debug: java -jar "/.npm/lib/node_modules/appium/node_modules/appium-adb/jars/appium_apk_tools.jar" "stringsFromApk" "/workspace/my_app/bin/target/android/MyApp-debug.apk" "/tmp/com.rhomobile.myapp"
debug: Not uninstalling app since server not started with --full-reset
debug: Checking app cert for /workspace/my_app/bin/target/android/MyApp-debug.apk: java -jar "/.npm/lib/node_modules/appium/node_modules/appium-adb/jars/verify.jar" "/workspace/my_app/bin/target/android/MyApp-debug.apk"
debug: App already signed.
debug: Zip-aligning /workspace/my_app/bin/target/android/MyApp-debug.apk
debug: Checking whether zipalign is present
debug: Using zipalign from /opt/android-sdk-linux/build-tools/19.1.0/zipalign
debug: zipAlignApk: "/opt/android-sdk-linux/build-tools/19.1.0/zipalign" -f 4 "/workspace/my_app/bin/target/android/MyApp-debug.apk" "/tmp/appium11478-19033-28nm25.tmp"
debug: MD5 for app is a15e6b2fbbceb96451b0bc5c58373c0f
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "ls /data/local/tmp/a15e6b2fbbceb96451b0bc5c58373c0f.apk"
debug: Getting install status for com.rhomobile.myapp
debug: Getting device API level
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "getprop ro.build.version.sdk"
debug: Device is at API Level 19
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "pm list packages -3 com.rhomobile.myapp"
debug: App is installed
info: App is already installed, resetting app
debug: Running fast reset (stop and clear)
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "am force-stop com.rhomobile.myapp"
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "pm clear com.rhomobile.myapp"
debug: Forwarding system:8080 to device:8080
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 forward tcp:8080 tcp:8080
debug: Pushing settings apk to device...
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 install "/.npm/lib/node_modules/appium/build/settings_apk/settings_apk-debug.apk"
debug: Pushing unlock helper app to device...
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 install "/.npm/lib/node_modules/appium/build/unlock_apk/unlock_apk-debug.apk"
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "dumpsys window"
debug: Writing dumpsys output to /.npm/lib/node_modules/appium/.dumpsys.log
debug: Screen already unlocked, continuing.
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "am instrument -e main_activity 'com.rhomobile.rhodes.RhodesActivity' com.rhomobile.myapp.selendroid/io.selendroid.ServerInstrumentation"
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/status","method":"GET"}
debug: Selendroid server is alive!
debug: Listening for Selendroid logs
debug: Creating Selendroid session
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/session","method":"POST","json":{"desiredCapabilities":{"warnings":{},"desired":{"platformName":"android","deviceName":"Android Emulator","automationName":"selendroid","app":"/workspace/my_app/bin/target/android/MyApp-debug.apk"},"platformName":"android","deviceName":"Android Emulator","automationName":"selendroid","app":"/workspace/my_app/bin/target/android/MyApp-debug.apk"}}}
debug: Successfully started selendroid session
debug: Waiting for pkg "com.rhomobile.myapp" and activity "com.rhomobile.rhodes.RhodesActivity" to be focused
debug: Getting focused package and activity
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "dumpsys window windows"
debug: [SELENDROID] http://localhost:8080/wd/hub/session/b40202ed-ce8b-3da8-169b-a634a662d659
debug: Overriding session id with "b40202ed-ce8b-3da8-169b-a634a662d659"
debug: Device launched! Ready for commands
debug: Setting command timeout to the default of 60 secs
debug: Setting command timeout to 60 secs
debug: Responding to client with success: {"status":0,"value":60,"sessionId":"f6ee70cd-9355-76d0-5495-42a57f594220"}
info: <-- POST /wd/hub/session/f6ee70cd-9355-76d0-5495-42a57f594220/appium/app/reset 200 32742.524 ms - 74 {"status":0,"value":60,"sessionId":"f6ee70cd-9355-76d0-5495-42a57f594220"}
info: --> DELETE /wd/hub/session/f6ee70cd-9355-76d0-5495-42a57f594220 {}
info: Shutting down appium session
debug: Stopping selendroid server
debug: Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/b40202ed-ce8b-3da8-169b-a634a662d659","method":"DELETE"}
debug: executing: "/opt/android-sdk-linux/platform-tools/adb" -s emulator-5554 shell "am force-stop com.rhomobile.myapp"
debug: Stopping logcat capture
debug: Logcat terminated with code null, signal SIGTERM
debug: Cleaning up appium session
debug: Responding to client with success: {"status":0,"value":null,"sessionId":"f6ee70cd-9355-76d0-5495-42a57f594220"}
info: <-- DELETE /wd/hub/session/f6ee70cd-9355-76d0-5495-42a57f594220 200 2964.928 ms - 76 {"status":0,"value":null,"sessionId":"f6ee70cd-9355-76d0-5495-42a57f594220"}
require 'rubygems'
$android_driver_loaded = false
ENV['RAILS_ENV'] ||= 'test'
# Load rails + environment
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
# Load matchers/helpers
require 'shoulda-matchers'
require 'rspec-html-matchers'
require 'json_spec'
# Load database cleaner
require 'database_cleaner'
# Load capybara and its dependencies
require 'capybara/rspec'
require 'capybara/rails'
require 'selenium-webdriver'
require 'headless'
Capybara.server_host = '0.0.0.0'
Capybara.server_port = 56844
# Load carrierwave helpers
require 'carrierwave/test/matchers'
# Needed by elasticsearch
require 'rake'
RSpec.configure do |config|
# When present, test with :focus tag will be tested alone
#config.filter_run :focus => true
# Spec mock
config.mock_with(:rspec) { |c| c.syntax = [:should, :expect] }
# Includes FactoryGirl syntax
config.include FactoryGirl::Syntax::Methods
# Include JsonSpec helpers
config.include JsonSpec::Helpers
# Include carrierwave helpers
config.include CarrierWave::Test::Matchers
# Do not use transactional, let database_cleaner do the work
config.use_transactional_fixtures = false
# Anonymous controller
config.infer_base_class_for_anonymous_controllers = true
# Run specs in random order. Can fix the order by providing the seed: --seed 1234
config.order = 'random'
# Log example name before running it
# config.before(:each) do |x|
# Rails.logger.debug '============================================='
# Rails.logger.debug x.example.metadata[:example_group][:full_description]
# end
# Cache test config
config.before(:each, cache: true) { Rails.cache.clear }
config.before(:each, type: :feature) { Rails.cache.clear }
# CarrierWave test config
config.before(:each) { CarrierWave.configure { |c| c.enable_processing = false } }
config.after(:suite) { FileUtils.rm_rf Dir.glob('public/test/*') }
# Mailer test config
config.before(:each, mailer: true) { ActionMailer::Base.deliveries.clear }
# Sidekiq test config
config.before(:each, sidekiq: true) { Sidekiq::Worker.clear_all }
# Elasticsearch test config
config.before(:each, elasticsearch: true) { before_test_initialize_elasticsearch Product }
config.after(:each, elasticsearch: true) { after_test_clean_elasticsearch Product }
# Database cleaner config
config.before(:suite) { DatabaseCleaner.clean_with :truncation }
config.before(:each) { DatabaseCleaner.strategy = :transaction }
config.before(:each, js: true) { DatabaseCleaner.strategy = :truncation }
config.before(:each, android: true) { DatabaseCleaner.strategy = :truncation }
config.before(:each, truncation: true) { DatabaseCleaner.strategy = :truncation }
config.before(:each) { DatabaseCleaner.start }
config.after(:each) { DatabaseCleaner.clean }
# HAML helpers
config.include Haml
config.include Haml::Helpers
config.before(:each, type: :view) { init_haml_helpers }
# Headless for selenium driver
config.before(:suite) { Headless.new(display: (99 + ENV['TEST_ENV_NUMBER'].to_i), destroy_at_exit: false).start }
config.after(:suite) { Headless.new(display: (99 + ENV['TEST_ENV_NUMBER'].to_i), reuse: true).destroy }
# Android driver
config.before(:each, android: true) {
# Load appium, and create driver
require 'appium_capybara'
Capybara.register_driver :android do |app|
options = {
start_capybara_server: true,
appium_lib:{
server_url: 'http://localhost:4723/wd/hub' },
caps: {
platformName: :android,
deviceName: 'Android Emulator',
automationName: 'selendroid',
app: '/workspace/my_app/bin/target/android/MyApp-debug.apk' } }
Appium::Capybara::Driver.new app, options
end
# Set capybara
Capybara.default_driver = :android
Capybara.default_wait_time = 30
$android_driver_loaded = true
}
config.after(:suite) { Capybara.current_session.driver.browser.driver_quit if $android_driver_loaded }
end
# Load factories
FactoryGirl.reload
# Load custom matchers and macros, etc
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }