2012-12-21 52 views
3

我想在android中使用uiautomator工具来开启wifi作为测试用例的一部分。我试着在uiautomator测试情况下,使用下面的代码:如何在android设备的uiautomator测试用例中打开wifi?

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

,但它给了这个错误:

"getSystemservice" method is undefined for Mainclass

回答

-3

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

+0

另外我想知道,如果我们可以在uiautomator中运行测试用例时检查wifi连接是否处于活动状态,即使我手动开启wifi也可以检查数据包是否交换。那可能吗? – user1907534

+0

既然我们可以在这个中使用android的所有assert函数,为什么不用这个函数呢? – user1907534

0

您可以启用或通过亚行停用WiFi如下

adb shell sqlite3 /data/data/com.android.providers.settings/databases/settings.db update secure set value=1 where name='wifi_on'; .exit

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

+1

以上命令给sqlite3命令找不到错误 – user1907534

7

实际上,你可以使用UIAutomator设置无线网络设置和关闭。我今天晚上写了代码:)

这是代码。你可以把它添加到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; 
} 

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

+0

如果有多个switch元素会发生什么情况? – Rilwan

+0

@Rilwan您可以在Android中提供一个示例,其中有一个项目有多个开关元素吗?如果是这样,欢迎您在StackOverflow上发布一个新问题,并从此链接到它。 – JulianHarty

+0

这里的Wi-Fi上面的代码将工作。但是如果你在三星手机上看NFC,如果你点击NFC并转到NFC页面 - >同样你可以看到两个开关。因此,如果我们修改代码更通用这样'UIObject类项目= itemsList.getChildByText(新UiSelector() \t \t \t \t类名(LinearLayout.class.getName()),switch_label,真的。); \t \t UIObject的switchObject = item.getChild(新UiSelector() \t \t \t \t类名(android.widget.Switch.class.getName()));'这是否有道理? – Rilwan

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\"") 
0

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

UIAutomator基于UI自动化只能访问xml地图应用程序,而不是Android APIs

可以使用Android shell命令的建议启用/禁用无线网络由Eric Rommel

并不需要进行验证,因为这些类型的系统指令(需要根访问)

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

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

或者,也通过使用UIAutomator到ENA UI元素遍历ble/disable WiFi并验证为JulianHarty

1

建议在Android 4.2和4上使用。4

在代码中开启Android WLAN设置:

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

要与UiAutomator点击on/off开关(你确定你是在良好的活性后):

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设置应用程序将来会发展,那可能还不够。