Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 葫芦步骤,检查应用程序是否第一次运行_Android_Ruby_Calabash_Calabash Android - Fatal编程技术网

Android 葫芦步骤,检查应用程序是否第一次运行

Android 葫芦步骤,检查应用程序是否第一次运行,android,ruby,calabash,calabash-android,Android,Ruby,Calabash,Calabash Android,看来葫芦不够我用 我的设想是: -如果用户第一次登录,我的应用程序会弹出一个包含编辑文本字段的视图,要求用户输入昵称,然后用户输入姓名,例如“John”,然后按确定按钮,然后我的应用程序会弹出一个包含文本“准备就绪”的视图 -如果用户不是第一次登录,我的应用程序会弹出一个包含文本“准备就绪”的视图 (在我的应用程序代码中,我检查是否存在唯一id,如果没有,则为第一次登录) 我可能错了,但我想我需要用Ruby为这个场景编写自己的步骤定义,我查看了下面的示例代码: Then /^I see the

看来葫芦不够我用

我的设想是:

-如果用户第一次登录,我的应用程序会弹出一个包含
编辑文本
字段的视图,要求用户输入昵称,然后用户输入姓名,例如“John”,然后按确定按钮,然后我的应用程序会弹出一个包含文本“准备就绪”的视图

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

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

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

Then /^I see the text "([^\"]*)"$/ do |text|
  macro %Q|I should see "#{text}"|
我迷路了我的问题是:

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


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

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

因此,您可以使用检查此文件是否存在和/或分析其内容

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

# 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命令以列出位于应用程序数据目录中的共享\u 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
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
请注意,-s修饰符是可选的,用于选择特定的序列号。如果您同时连接了多个设备,则序列号应作为环境变量导出(ADB_DEVICE_ARG)

您需要提供当前的应用程序包id(类似com.android.camera)

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

def is_first_login
    list_shared_pref('com.yourapp.packageid').include? "firstLogin.xml"
end
您可以在步骤定义目录中声明的自定义步骤中调用该函数:

def list_shared_pref(your_app_package_id)
    `adb -s #{ENV['ADB_DEVICE_ARG']} run-as #{your_app_package_id} ls shared_prefs/`
end
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
更新:


参考我的答案

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

  • 您可以通过蓝牙或Wi-fi获取设备IMEI(支持SIM卡)或其他内部版本号或MAC。并检查它是否存在,如果响应中不存在,则发送标志以显示编辑文本屏幕或其他

  • 但请记住,此唯一键必须不同。

    您可以使用共享首选项来执行此操作

     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();
    
        }
    }
    
    公共类登录扩展活动{
    SharedReferences prefs=null;
    按钮登录;
    HashMapparams=新的HashMap();
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //也许在这里设置内容视图
    prefs=getSharedReferences(“com.yourapp.packagename”,MODE\u PRIVATE);
    login=(按钮)findviewbyd(R.id.Button);
    login.setOnClickListener(新视图.OnClickListener()
    {
    @凌驾
    公共void onClick(视图v)
    {
    boolean firstloginfromapp=prefs.getBoolean(“firstrun”,true);
    参数put(“第一次”,firstloginfromapp);
    参数put(“userid”,userid);
    参数put(“密码”,密码);
    JsonObjectRequest JSONObjectReq=新的JsonObjectRequest(Method.GET,
    url,参数,
    新的Response.Listener(){
    @凌驾
    公共void onResponse(JSONObject响应){
    试一试{
    JSONObject ResponseObject=响应;
    if(responseObject.getString(“status”).equals(“success”))
    prefs.edit().putBoolean(“firstrun”,false.commit();
    }捕获(例外e){}
    }
    },new Response.ErrorListener(){
    @凌驾
    公共无效onErrorResponse(截击错误){
    d(标记“Error:+Error.getMessage());
    //隐藏进度对话框
    pDialog.hide();
    }
    });
    }
    });
    }
    @凌驾
    受保护的void onResume(){
    super.onResume();
    }
    }
    
    谢谢!这很有帮助,我会试试看。实际上,我还有一个问题,是否可以在Ruby中的步骤定义中检查设备的信任凭证存储?我还可以发布另一个关于此的专门问题。@Leem.fin您是否能够通过检查数据/共享prefs目录找到可以指示首次运行的内容?@Leem.fin我不知道设备的信任凭据存储。我不知道为什么会投反对票,因为我的答案基于其他可靠的讨论。不用担心,我把它投了回去:)我还想知道为什么它被投了反对票。下周我将尝试你的答案。谢谢。因为与手机交互的只有测试脚本,所以你应该知道应用程序是否已经启动,不是通过检查手机,而是通过在测试脚本中保存状态