我目前正在为混合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/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