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
更新:
参考我的答案 如果您正在寻找选项 这些是:
但请记住,此唯一键必须不同。您可以使用共享首选项来执行此操作
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我不知道设备的信任凭据存储。我不知道为什么会投反对票,因为我的答案基于其他可靠的讨论。不用担心,我把它投了回去:)我还想知道为什么它被投了反对票。下周我将尝试你的答案。谢谢。因为与手机交互的只有测试脚本,所以你应该知道应用程序是否已经启动,不是通过检查手机,而是通过在测试脚本中保存状态