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

时间:2016-07-21 08:38:19

标签: android ruby calabash calabash-android

看起来葫芦pre-defined steps对我的使用来说还不够。

我的情况是:

- 如果用户第一次登录,我的应用会弹出一个包含EditText字段的视图,要求用户输入昵称,然后用户输入名称,例如"约翰"然后按确定按钮,然后我的应用程序弹出一个包含文字的视图"准备好了#34;。

- 如果用户不是第一次登录,我的应用会弹出一个包含文字的视图"准备就绪"

(在我的应用代码中,我检查是否有持久的唯一ID,如果没有,则是第一次登录)

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

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

我迷路了。 我的问题是:

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

Q2 即可。如果上述问题的答案是否定的,如果在第一次登录时没有第一次登录时视图可能不同,我怎么能用calabash来测试我的情况。 (成像我需要多次在某些设备上运行测试,第一次登录视图与其余时间不同)

3 个答案:

答案 0 :(得分:0)

如果您正在测试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

答案 1 :(得分:0)

如果您正在寻找选择 这些是:

  1. 您可以获得设备IMEI(支持SIM),也可以通过蓝牙或Wi-Fi获取内置号码或MAC。并检查它的存在,如果不存在响应发送标志显示编辑文本屏幕,否则其他。
  2. 但请记住,这个唯一的密钥必须是不同的。

答案 2 :(得分:0)

您可以使用共享偏好来执行此操作

 public class Login extends Activity {

    SharedPreferences prefs = null;
    Button login;
    HashMap<String,String>params = new  HashMap<String,String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Perhaps set content view here

        prefs = getSharedPreferences("com.yourapp.packagename", MODE_PRIVATE);
        login = (Button)findViewById(R.id.button);
        login.setOnClickListener(new View.OnClickListener()
        {
             @Override
             public void onClick(View v)
               {
                  boolean firstloginfromapp = prefs.getBoolean("firstrun", true);

                  params .put ("firsttime",firstloginfromapp );
                  params .put ("userid",userid);
                  params .put ("password",password);

                  JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
            url, params,
            new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {

                 try{
                    JSONObject responseOject=response;
                     if(responseOject.getString("status").equals("success"))
                         prefs.edit().putBoolean("firstrun", false).commit();
                }catch(Exception e){}
               }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    // hide the progress dialog
                    pDialog.hide();
                }
            });

               }
             });
    }

    @Override
    protected void onResume() {
        super.onResume();

    }
}