如何在Android设备的uiautomator测试用例中打开wifi?

时间:2012-12-21 14:30:50

标签: android uiautomator

我想在android中使用uiautomator工具打开wifi作为测试用例的一部分。我尝试在uiautomator测试用例中使用以下代码:

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

但它给出了这个错误:

  

“getSystemservice”方法未定义为Mainclass

7 个答案:

答案 0 :(得分:7)

您实际上可以使用UIAutomator来打开和关闭WiFi设置。我今天晚上写了代码:)

这是代码。您可以将其添加到此处http://developer.android.com/tools/testing/testing_ui.html

的Android示例中

在课程顶部添加以下枚举

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;
}

循环是为了补偿我观察到的一些行为,其中点击似乎没有改变开关位置。

答案 1 :(得分:2)

启用WiFi:
device.executeShellCommand("svc wifi enable");

禁用WiFi:
device.executeShellCommand("svc wifi disable");

这些是在UiDevice上使用的命令。

答案 2 :(得分:1)

在我使用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\"")

答案 3 :(得分:1)

用于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();
        }
    }
}

已知限制:它正在搜索第一个可用的Switch。如果你有自定义ROM或者Android设置应用程序将来发展,那可能还不够。

答案 4 :(得分:0)

您可以通过adb启用或禁用wifi,如下所示

  

adb shell sqlite3   /data/data/com.android.providers.settings/databases/settings.db更新   secure set value = 1其中name ='wifi_on'; .exit

但你不能使用uiautomator工具做同样的事情

答案 5 :(得分:0)

您收到此错误是因为UIAutomator不是Android context;因此,您无法访问getSystemservice方法

UIAutomator是基于用户界面的自动化系统,只能访问您应用的xml地图,而不能访问Android APIs

您可以按Eric Rommel的建议使用android shell命令启用/禁用WiFi 这不需要验证,因为这些是系统指令(需要root访问权)

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

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

或者,您使用UIAutomator遍历UI元素以启用/禁用WiFi并按JulianHarty

的建议进行验证

答案 6 :(得分:-3)

你不能这样做。 UI Automator测试不作为Android框架的一部分运行,因此它无法访问Android系统服务。这是为了测试用户界面;它并不声称是一个功能齐全的测试框架。在运行测试之前手动打开WiFi。