我目前正在为混合Android应用程序(即使用PhoneGap实现的Android应用程序)实现UI抓取工具,并且抓取工具需要定期重新启动才能生成UI模型。在这里,通过“重启”,我的意思是卸载应用程序,重新安装相同的应用程序,并继续执行爬虫。 (这个想法是为了达到与以前相同的初始状态。有人可能会说我可以重新加载初始HTML页面,但这只有在应用程序不保存和重用任何数据(如登录信息等)时才有效。数据需要保持新鲜 - 即第一次安装应用程序时的情况。)
我对Android应用程序开发很陌生,所以我决定测试一下可能是最天真的方法。我写的测试代码如下所示。方法testReinstall()作为Android JUnit测试运行,我使用Robotium 4.3在应用程序上执行点击和其他事件。
package com.example.googleauthenticator.test;
import java.io.IOException;
import android.test.ActivityInstrumentationTestCase2;
import com.example.googleauthenticator.MainActivity;
import com.jayway.android.robotium.solo.By;
import com.jayway.android.robotium.solo.Solo;
public class ReinstallTest extends ActivityInstrumentationTestCase2<MainActivity> {
private Solo solo;
public ReinstallTest() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
public void testReinstall() {
//Reinstall app
Runtime rt = Runtime.getRuntime();
Process pr;
try {
pr = rt.exec("adb uninstall com.example.googleauthenticator"); //Uninstall
pr.waitFor();
pr = rt.exec("adb install GoogleAuthenticator.apk"); //Install
pr.waitFor();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException ie) {
// TODO Auto-generated catch block
ie.printStackTrace();
}
System.out.println("Reinstall done!");
//Perform some action
if (solo.waitForWebElement(By.id("add"))) {
solo.clickOnWebElement(By.id("add"));
}
}
@Override
protected void tearDown() throws Exception{
solo.finishOpenedActivities();
super.tearDown();
}
}
我尝试运行上面的代码,似乎它能够成功卸载应用程序(或者,至少,我知道数据/ data / com.example.googleauthenticator文件夹已被删除)。但是,应用程序没有重新安装(即,data / data / com.example.googleauthenticator文件夹仍然没有),我认为这与第一次调用pr.waitFor()时的事实有关到达时,testReinstall()因“进程崩溃”而终止,并且LogCat中出现以下消息:
11-08 17:08:32.763: W/PluginManager(9285): Can't find plugin: com.example.googleauthenticator
我在这里缺少什么?是否有更好/更正确的方法?
编辑:要清楚,我还收到以下错误消息:
11-08 17:33:40.883: D/WebKit(14828): Unabled to create LocalStorage database path /data/data/com.example.googleauthenticator/app_database/localstorage
答案 0 :(得分:0)
您无法删除正在测试的应用程序,实际退出您正在测试的应用程序将意味着您的测试停止运行,这是因为使用仪器测试您的测试和应用程序是相同的过程。
仅仅因为你不能通过机器人/仪器做你想做的事情虽然并不意味着你想做什么是不可能的,你只需要使用一个不是基于设备运行的自动化工具,例如Calabash会自动根据您是否使用正确的注释,为您重新安装应用程序,这可能更适合您想要做的事情。