如何在 UI 测试 Espresso android 中超越位置启用对话?
How to surpass location enabler dialogue in UI testing Espresso android?
我正在使用 Espresso UI 测试 android。我想 运行 在设置中关闭位置的测试,但由于其他测试失败,我被位置启用对话框卡住了。我已经提到了我的观察和我到目前为止所做的尝试
- 使用 UiAutomator,它仅适用于单个测试用例,但在
完成 运行 测试套件。
- 使用了Grant permission rule,它给了权限但是对话还在
存在。
用过Roboelectric,对问题没有影响
用了Shadow操作,对问题没有影响
我还附上了位置对话的样本图片。
谢谢。
目前我正在使用 grantPerms 方法,该方法应该添加到所有测试 classes(所有 = test-classes 需要访问 android 权限)所以我只是打电话在正确的时间(如果应用程序需要烫发)。
方案如下:
public class MyClass {
// Rules etc.
@Test
public void myTestWithPerms() {
// click view, if it's need permissions to camera etc., just call
grantPerms(); //calling inner grantPerms method
// Another code, if you need access to gallery now
grantPerms(); //calling inner grantPerms method
// Some test code
}
private void grantPerms(){
// grantPermsCode
}
}
或者您的意思是具体的?
更新
我明白了,所以我将举例说明我是如何解决它的,对我来说这是一个很好的解决方案。
- 示例: 假设您有一些与 phone 联系人互动的应用程序(在您的应用程序中第一次点击 "Contact btn" 应该会导致 android 权限提醒 "Deny/Allow" btns)
- 所以目前你的测试将有一个line-wise结构(访问activity/screen - >通过某些参数检查UI组件的存在(标题、ID、包名称等...) -> 单击此组件)
- 现在在第一次点击后 你应该执行 android 权限警报(你知道在哪个操作(点击等)之后应该显示此警报)
所以你只需要在你的测试中创建一个内部私有方法 class(目前需要访问android权限) 上面添加了方案
UPDATE2: 通常你不能以编程方式打开 GPS 服务,这是不允许的,因为 android v.4.2,所以通常最好打开 GPS在测试开始之前手动服务,但看看这个
解决方法,也许这就是你想要的:
public class MyTestClass {
// Rules etc.
@Test
public void myTestWithTurnOnGPS() {
// once access the map check alert presence
tapTurnOnGpsBtn(); //call inner **tapTurnOnGpsBtn** method
}
private void tapTurnOnGpsBtn() throws UiObjectNotFoundException {
UiObject allowGpsBtn = device.findObject(new UiSelector()
.className("android.widget.Button").packageName("com.google.android.gms")
.resourceId("android:id/button1")
.clickable(true).checkable(false));
device.pressDelete(); // just in case to turn ON blur screen (not a wake up) for some devices like HTC and some other
if (allowGpsBtn.exists() && allowGpsBtn.isEnabled()) {
do {
allowGpsBtn.click();
} while (allowGpsBtn.exists());
}
}
}
所以这个方法应该在你的应用程序中所有应该引发 GPS 警报的地方调用 ()
我正在使用 Espresso UI 测试 android。我想 运行 在设置中关闭位置的测试,但由于其他测试失败,我被位置启用对话框卡住了。我已经提到了我的观察和我到目前为止所做的尝试
- 使用 UiAutomator,它仅适用于单个测试用例,但在 完成 运行 测试套件。
- 使用了Grant permission rule,它给了权限但是对话还在 存在。
用过Roboelectric,对问题没有影响
用了Shadow操作,对问题没有影响
我还附上了位置对话的样本图片。
谢谢。
目前我正在使用 grantPerms 方法,该方法应该添加到所有测试 classes(所有 = test-classes 需要访问 android 权限)所以我只是打电话在正确的时间(如果应用程序需要烫发)。
方案如下:
public class MyClass {
// Rules etc.
@Test
public void myTestWithPerms() {
// click view, if it's need permissions to camera etc., just call
grantPerms(); //calling inner grantPerms method
// Another code, if you need access to gallery now
grantPerms(); //calling inner grantPerms method
// Some test code
}
private void grantPerms(){
// grantPermsCode
}
}
或者您的意思是具体的?
更新 我明白了,所以我将举例说明我是如何解决它的,对我来说这是一个很好的解决方案。
- 示例: 假设您有一些与 phone 联系人互动的应用程序(在您的应用程序中第一次点击 "Contact btn" 应该会导致 android 权限提醒 "Deny/Allow" btns)
- 所以目前你的测试将有一个line-wise结构(访问activity/screen - >通过某些参数检查UI组件的存在(标题、ID、包名称等...) -> 单击此组件)
- 现在在第一次点击后 你应该执行 android 权限警报(你知道在哪个操作(点击等)之后应该显示此警报)
所以你只需要在你的测试中创建一个内部私有方法 class(目前需要访问android权限) 上面添加了方案
UPDATE2: 通常你不能以编程方式打开 GPS 服务,这是不允许的,因为 android v.4.2,所以通常最好打开 GPS在测试开始之前手动服务,但看看这个
解决方法,也许这就是你想要的:
public class MyTestClass { // Rules etc. @Test public void myTestWithTurnOnGPS() { // once access the map check alert presence tapTurnOnGpsBtn(); //call inner **tapTurnOnGpsBtn** method } private void tapTurnOnGpsBtn() throws UiObjectNotFoundException { UiObject allowGpsBtn = device.findObject(new UiSelector() .className("android.widget.Button").packageName("com.google.android.gms") .resourceId("android:id/button1") .clickable(true).checkable(false)); device.pressDelete(); // just in case to turn ON blur screen (not a wake up) for some devices like HTC and some other if (allowGpsBtn.exists() && allowGpsBtn.isEnabled()) { do { allowGpsBtn.click(); } while (allowGpsBtn.exists()); } }
}
所以这个方法应该在你的应用程序中所有应该引发 GPS 警报的地方调用 ()