android - Calabash 步骤检查应用程序是否是第一次运行

标签 android ruby calabash calabash-android

看起来像葫芦pre-defined steps不足以满足我的使用需求。

我的场景是这样的:

- 如果用户第一次登录,我的应用程序会弹出一个包含 EditText 字段的 View ,要求用户输入昵称,然后用户输入姓名,例如“John”并按 OK 按钮,然后我的应用会弹出一个包含文本“Ready to go”的 View 。

- 如果用户不是第一次登录,我的应用会弹出一个 View ,其中包含文本“Ready to go”

(在我的应用程序代码中,我检查是否存在唯一标识,如果没有,则为第一次登录)

我可能是错的,但我想我需要为这种情况在 Ruby 中编写自己的步骤定义,我查看了下面的示例代码:

Then /^I see the text "([^\"]*)"$/ do |text|
  macro %Q|I should see "#{text}"|

我迷路了。 我的问题是:

Q1。是否可以从 calabash 调用 Android SDK API,以便我也可以通过 ruby​​ 代码检查这是否是第一次登录?

Q2。如果上述问题的答案是否定的,如果第一次登录与非第一次登录时 View 可能不同,我如何使用葫芦来测试我的案例。 (想象一下我需要在某些设备上多次运行测试,第一次登录 View 与其余时间不同)

最佳答案

如果您正在测试一个 Android 应用程序,这个应用程序很可能会创建一个共享首选项文件。

所以你可以使用adb检查此文件是否存在和/或解析其内容。

首先通过尝试列出和检查应用程序创建的文件来手动执行此操作,以映射在什么情况下发生的某些变化可能会给您一个迹象,表明这不是第一次登录:

# listing some app's prefs
$ adb run-as com.myapp.package ls shared_prefs/

# some file contents
$ adb run-as com.myapp.package cat shared_prefs/someprefs.xml

以下示例函数运行 adb 命令以列出位于应用程序数据目录内的 shared_prefs 目录中的文件:

def list_shared_pref(your_app_package_id)
    `adb -s #{ENV['ADB_DEVICE_ARG']} run-as #{your_app_package_id} ls shared_prefs/`
end

请注意,-s 修饰符是可选的,如果您同时连接多个设备,它用于选择特定的序列号,序列号应作为环境变量导出(ADB_DEVICE_ARG ).

并且您需要提供当前应用程序包 ID(类似于 com.android.camera)

假设您发现当用户执行首次登录时,应用会创建一个名为 firstLogin.xml 的共享首选项,那么您可以执行以下操作:

def is_first_login
    list_shared_pref('com.yourapp.packageid').include? "firstLogin.xml"
end

您可以在 step_definitions 目录中声明的自定义步骤中调用该函数:

Given(/^I'm not in first login$/) do
  unless is_first_login
      # DO STUFF
  else
      raise "Error: Did not expected to be the first login"
  end

  # optional pause
  sleep(STEP_PAUSE)
end

更新:

我的回答引用。 Determine if android app is the first time used

关于android - Calabash 步骤检查应用程序是否是第一次运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38499166/

相关文章:

android - 如何在 Android 中逐个字母淡入 TextView

java - 在 Android 中将参数设置为布局时崩溃

ruby - 遵循 Ruby 中 "Methods return other PageObjects"的测试自动化最佳实践

ruby-on-rails - 无法在 Windows 上运行 bundle 更新

ruby-on-rails - 如果我在 Ruby on Rails 中有一个散列,有没有办法让它无差别访问?

ios - 无法在 iOS 设备上为 Xamarin 应用程序运行 Calabash 测试

css - 我无法在 WebView 上下文中查询

android - 试图保存我的应用程序的日志,过滤它们并将它们发送到云端

代码自动完成时 Android Studio 崩溃

css - 如何在 nokogiri css 选择器中使用 ruby​​ 表达式插值 "#{var}"?