Как включить Wi-Fi в тестовом примере uiautomator на устройстве Android?

Я хочу включить Wi-Fi как часть тестового примера с помощью инструмента uiautomator в android. Я пробовал использовать следующий код в uiautomator тестовом примере:

WifiManager wi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
      if(wi.isWifiEnabled()){
        wi.setWifiEnabled(false);
      }else{
        wi.setWifiEnabled(true);
    }

но это дало эту ошибку:

Метод getSystemservice не определен для Mainclass


person user1907534    schedule 21.12.2012    source источник


Ответы (6)


Фактически вы можете использовать UIAutomator для включения и выключения Wi-Fi. Я написал код сегодня вечером :)

Вот код. Вы можете добавить его в пример Android, который находится здесь http://developer.android.com/tools/testing/testing_ui.html

Добавьте следующее перечисление вверху класса

private enum OnOff {
    Off,
    On
};

Добавьте новый код после:

    // Validate that the package name is the expected one
    UiObject settingsValidation = new UiObject(new UiSelector()
    .packageName("com.android.settings"));
    assertTrue("Unable to detect Settings", settingsValidation.exists());

Вот новый код:

    UiSelector settingsItems = new UiSelector().className(android.widget.TextView.class.getName());
    UiObject wiFi = appViews.getChildByText(settingsItems, "Wi-Fi");

    // We can click on Wi-Fi, e.g. wiFi.clickAndWaitForNewWindow();
    // So we know we have found the Wi-Fi setting

    UiSelector switchElement = new UiSelector().className(android.widget.Switch.class.getName());
    setSwitchTo(OnOff.Off); // Or set it to On as you wish :)
}   

private void setSwitchTo(OnOff value) throws UiObjectNotFoundException {

    String text;
    UiObject switchObject = getSwitchObject();
    for (int attempts = 0; attempts < 5; attempts++) {
        text = switchObject.getText();
        boolean switchIsOn = switchObject.isChecked();
        final OnOff result;
        if (switchIsOn) {
            result = OnOff.On;
        } else {
            result = OnOff.Off;
        }

        System.out.println("Value of switch is " + switchObject.isSelected() + ", " + text + ", " + switchIsOn);
        if (result == value) {
            System.out.println("Switch set to correct value " + result);
            break;
        } else {
            switchObject.click();
        }
    }
}

private UiObject getSwitchObject() {
    UiObject switchObject = new UiObject(new UiSelector().className(android.widget.Switch.class.getName()));
    assertTrue("Unable to find the switch object", switchObject.exists());
    String text;
    return switchObject;
}

Цикл должен был компенсировать некоторое поведение, которое я наблюдал, когда щелчок не менял положение переключателя.

person JulianHarty    schedule 08.03.2013
comment
что произойдет, если переключателей будет больше одного? - person Rilwan; 22.10.2013
comment
@Rilwan, не могли бы вы привести пример на Android, где есть несколько элементов переключения для элемента? И если это так, вы можете разместить новый вопрос в StackOverflow и сделать ссылку на него из этого. - person JulianHarty; 30.10.2013
comment
Здесь в случае Wi-Fi вышеуказанный код будет работать. Но если вы посмотрите NFC в телефонах Samsung, если вы нажмете NFC и перейдете на страницу NFC - ›Снова вы увидите два переключателя. Итак, если мы модифицируем более общий код, как этот UiObject item = itemsList.getChildByText(new UiSelector(). className(LinearLayout.class.getName()),switch_label, true); UiObject switchObject = item.getChild(new UiSelector(). className(android.widget.Switch.class.getName())); Имеет ли это смысл? - person Rilwan; 31.10.2013
comment
У меня нет подходящего телефона Samsung под рукой, а на моем Nexus 4 есть только одна галочка для включения или отключения NFC, поэтому мне нелегко проверить, работает ли предложенный вами код, по крайней мере, в настоящее время. Вы пробовали свой код на одном из упомянутых вами устройств Samsung с этими двумя переключателями? - person JulianHarty; 07.11.2013
comment
Ух ты ... Нажатие 5 раз на кнопку (и без сна) и это считается лучшим ответом ?? Кто-нибудь, чтобы объяснить, почему это выглядит так взломано? - person Kikiwa; 25.04.2016
comment
@kikiwa Я согласен, что мое решение было уродливым и хакерским. Я написал это как пробную версию, чтобы быстро показать, что то, о чем просили, можно выполнить. Он не был и не предназначен для использования в качестве производственного кода качества. Вы и другие можете улучшить код и / или дать другой, лучший ответ. Всего наилучшего. - person JulianHarty; 04.05.2016
comment
Спасибо @JulianHarty за ответ спустя годы. На самом деле я не понимаю, зачем нам нужен этот цикл повтора. В моем проекте у меня нет этого цикла, и он отлично работает, может быть, потому что я жду представления, может быть, потому что мы не работаем над той же версией Android, может быть, что-то еще? У вас есть какие-нибудь подсказки, которые могли бы объяснить необходимость повторной попытки? - person Kikiwa; 12.05.2016
comment
@Kikiwa Я написал цикл в то время, что является ранней историей с точки зрения Android, когда UI Automator был несовершеннолетним и имел несколько известных недостатков. Я надеюсь, что эти недостатки были устранены в более поздних обновлениях инструментов Android, и, возможно, цикл не нужен при их использовании. Я оставлю это здесь в своем ответе по двум основным причинам: 1) это то, что было необходимо в то время, и некоторые люди все еще могут в конечном итоге использовать более старые версии инструментов и, следовательно, нуждаются в этом 2) он представляет собой пример, хотя уродливый обходной путь. На этой неделе мне пришлось искать обходные пути для Android Instrumentation! - person JulianHarty; 13.05.2016
comment
Что такое appViews? Это не API UiAutomator. - person IgorGanapolsky; 16.03.2017
comment
@IgorGanapolsky Хороший вопрос, это было бы в исходном коде, который я написал еще в 2013 году. Вероятно, это давно потеряно, или, по крайней мере, мне потребуется время, чтобы найти. Я проверил ссылку на Документы Google на предмет подсказок, но они значительно изменились до такой степени, что я не нашел пример, который использовал в то время. Я посмотрю, смогу ли я найти код и / или воспроизвести этот пример. Если и когда у меня будет обновление, я предоставлю его здесь. - person JulianHarty; 21.03.2017

Чтобы включить Wi-Fi:
device.executeShellCommand("svc wifi enable");

Чтобы отключить Wi-Fi:
device.executeShellCommand("svc wifi disable");

Это команды для использования на вашем UiDevice.

person avz    schedule 23.05.2020

В своих тестах с UIAutomator я использую:

Runtime.getRuntime().exec("\"svc wifi disable\"")

Runtime.getRuntime().exec("\"svc wifi enable\"")

Runtime.getRuntime().exec("\"svc data disable\"")

Runtime.getRuntime().exec("\"svc data enable\"")
person Eric Rommel    schedule 15.10.2014

Используется в производственной среде на Android 4.2 и 4.4.

Чтобы открыть настройки Android Wifi в вашем коде:

final Intent intent = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK);
mContext.startActivity(intent);

Чтобы щелкнуть переключатель включения / выключения с помощью UiAutomator (после того, как вы уверены, что находитесь в хорошем состоянии):

public void enableWifiOnAndroidWifiSettings(boolean enabled) throws UiObjectNotFoundException {
    final UiSelector wifiSwitchSelector = new UiSelector().className(android.widget.Switch.class.getName());
    UiObject wifiSwitch = UiDevice.getInstance(sInstrumentation).findObject(wifiSwitchSelector);
    if (wifiSwitch.waitForExists(5000) && wifiSwitch.isEnabled()) {
        if (wifiSwitch.isChecked() != enabled) {
            wifiSwitch.click();
        }
    }
}

Известное ограничение: поиск первого доступного коммутатора. Если у вас есть пользовательское ПЗУ или приложение Android Settings будет развиваться в будущем, этого, возможно, будет недостаточно.

person Kikiwa    schedule 12.05.2016

Вы можете включить или отключить Wi-Fi через adb следующим образом

оболочка adb sqlite3 /data/data/com.android.providers.settings/databases/settings.db update secure set value = 1 where name = 'wifi_on'; .выход

Но вы не можете использовать инструмент uiautomator, чтобы сделать то же самое.

person Durairaj Packirisamy    schedule 14.01.2013

Вы не можете этого сделать. Тест UI Automator не запускается как часть платформы Android, поэтому у него нет доступа к системным службам Android. Он предназначен для тестирования пользовательского интерфейса; он не претендует на звание полнофункциональной тестовой среды. Включите Wi-Fi вручную перед запуском теста.

person Joe Malin    schedule 21.12.2012
comment
Также я хочу знать, можем ли мы проверить, активно ли Wi-Fi-соединение при запуске тестового примера в uiautomator, даже если я включаю Wi-Fi вручную, могу ли я проверить, обмениваются ли пакеты данных. Это возможно? - person user1907534; 22.12.2012
comment
Поскольку в этом случае мы можем использовать все функции assert для Android, почему бы не использовать эту функцию? - person user1907534; 22.12.2012