0

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

1 回答 1

0

您无法删除您正在测试的应用程序,事实上退出您正在测试的应用程序将意味着您的测试停止运行,这是因为使用仪器,您的测试和您的应用程序是相同的过程。

仅仅因为你不能通过机器人/仪器做你想做的事,但这并不意味着你想做的事是不可能的,你只需要使用一个自动化工具,而不是基于在设备上运行的仪器,例如 Calabash 将自动重新安装应用程序对您而言,取决于您是否使用正确的注释,这可能更适合您想要做的事情。

于 2013-12-18T10:39:24.550 回答