Шаг Calabash, чтобы проверить, запускается ли приложение в первый раз

Похоже, что калебас предустановлен шагов недостаточно для моего использования.

Мой сценарий таков:

- Если пользователь входит в систему в первый раз, в моем приложении появляется всплывающее окно, содержащее поле EditText, предлагающее пользователю ввести псевдоним, а затем пользователь вводит имя, например. «Джон» и нажмите кнопку ОК, после чего в моем приложении появится всплывающее окно с текстом «Готово к работе».

- Если пользователь не входит в систему в первый раз, в моем приложении появляется всплывающее окно с текстом "Готово к работе"

(В моем коде приложения я проверяю, сохраняется ли уникальный идентификатор, если нет, это первый вход в систему)

Я могу ошибаться, но я думаю, что мне нужно написать собственное определение шага в Ruby для этого сценария, я посмотрел пример кода ниже:

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

Я потерялся. Мои вопросы:

Q1. Можно ли вызвать Android SDK API из калебаса, чтобы я также мог проверить, является ли это первым входом в систему или нет из рубинового кода?

Вопрос 2. Если ответ на приведенный выше вопрос отрицательный, как я могу использовать калебас для проверки моего случая, если представление может отличаться при первом входе в систему по сравнению с не первым входом в систему. (Воображаю, что мне нужно запустить тест на некоторых устройствах несколько раз, первое время входа в систему отличается от остальных раз)


person Leem.fin    schedule 21.07.2016    source источник
comment
Поскольку единственным, кто взаимодействует с телефоном, являются тестовые сценарии, вы должны знать, запущено ли приложение, не проверяя телефон, а сохраняя состояние в тестовых сценариях.   -  person Tobias    schedule 25.07.2016


Ответы (3)


Если вы тестируете приложение для 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).

И вам нужно указать текущий идентификатор пакета приложения (что-то вроде 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

ОБНОВЛЕНИЕ:

Ссылки на мой ответ. Определить, используется ли приложение Android впервые

person Rogério Peixoto    schedule 22.07.2016
comment
Благодарю вас! Это очень полезно, я попробую. На самом деле, у меня есть еще один вопрос, можно ли проверить доверительное хранилище учетных данных устройства при определении шага в Ruby? Я мог бы также опубликовать еще один специальный вопрос об этом. - person Leem.fin; 22.07.2016
comment
@ Leem.fin, вы смогли найти что-то, что может указывать на первый запуск, проверив каталог data/shared prefs? - person Rogério Peixoto; 24.07.2016
comment
@ Leem.fin Я не знаю о доверительном хранилище учетных данных устройства. - person Rogério Peixoto; 24.07.2016
comment
Я не знаю, почему проголосовали против, так как мой ответ был основан на другом серьезном обсуждении. - person Rogério Peixoto; 25.07.2016
comment
Не беспокойтесь, я проголосовал за него :) Мне также интересно, почему за него проголосовали. Я собираюсь попробовать ваш ответ на следующей неделе. Спасибо. - person Leem.fin; 28.07.2016

Если вы ищете варианты Вот некоторые из них:

  1. Вы можете либо получить IMEI устройства (поддерживается SIM-карта), либо номер сборки или MAC-адрес по Bluetooth или Wi-Fi. и проверьте его наличие, если нет, в ответ отправьте флаг, чтобы показать экран редактирования текста, иначе другое.

Но помните, что этот уникальный ключ должен быть другим.

person reload_vp    schedule 28.07.2016

вы можете использовать общие настройки, чтобы сделать это

 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();

    }
}
person SaravInfern    schedule 30.07.2016