2

我正在编写自动化测试代码(使用ActivityInstrumentationTestCase2)来测试涉及应用内计费版本 2(订阅)的应用。我需要帮助来弄清楚如何以编程方式让我的测试代码单击“使用信用卡付款/由 Google 钱包保护”对话框中出现的“接受并购买”按钮,该对话框据说是由某些 Google SDK 代码创建的。

我可以让测试代码单击由我自己的代码/活动创建的其他按钮,通常是通过从其父活动或视图访问按钮,然后调用.performClick()按钮上的方法。但据我所知,任何活动都无法访问此“购买”按钮。

看来此对话框可能是com.google.android.finsky.activities.IabActivity 基于 logcat 输出创建的。我使用 ActivityMonitor 观看此活动,但它从未被触发。如果您可以直接提供帮助,或者将我指向负责创建“使用信用卡付款”对话框或com.google.android.finsky.activities.IabActivity课程来源的相关 Google SDK 源代码,我将不胜感激。

4

5 回答 5

3

通常你不能在你自己的包之外检测活动。

您必须使用 UI Automator 框架来单击购买按钮。

于 2013-01-01T09:32:20.950 回答
1

感谢克里斯托弗。我设法使用 UI 自动化来获得我想要的效果。我必须先编写一个 shell 脚本来调用我的 Instrumentation Test,这会打开 Buy 对话框。然后调用
adb shell uiautomator runtest启动 UI 自动化代码点击“购买”按钮。不知道如何在它们之间同步,所以我只是使用一些睡眠代码来计时点击。这是 UI 自动化代码:

    UiDevice dev = getUiDevice();
    // wait for buy button to appear 
    while (true) {
        try {
            Thread.sleep(2000l);
            UiObject okButton = new UiObject(new UiSelector().text("Accept & buy").className("android.widget.Button"));
            okButton.click();
            break;
        } catch (Exception e) {
        }
    }   
    dev.waitForIdle();
于 2013-01-02T00:39:24.680 回答
1

使用uiautomator,这是我得到的最好的:

device.findObject(new UiSelector().resourceId("com.android.vending:id/continue_button")).click();
于 2016-11-25T21:58:04.880 回答
0

以下是在 android 中为 Button click 制作 Testcase 的建议。

您需要为您的 Activity 制作 ActivityInstrumentationTestCase2 然后执行以下操作。

初始化你的按钮

protected void setUp() throws Exception {
        super.setUp();
        mainActivity = getActivity();

        btnAcceptBuy= (Button) mainActivity.findViewById(R.id.btnaccept_buy);
    }



public void testFragmentKeypad(){

      AppLog.showLogE("TEST", "Keypad");

      TouchUtils.clickView(this, btnAcceptBuy);

  }

通过这种方式,您可以在 android 中执行您的按钮的点击测试。

于 2013-01-01T07:54:57.890 回答
0
    UiAutomation uiAutomation = new UiAutomation(Looper.getMainLooper(), new UiAutomationConnection());
    uiAutomation.setOnAccessibilityEventListener(new UiAutomation.OnAccessibilityEventListener() {
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {
            if (event.getEventType() == TYPE_WINDOW_STATE_CHANGED) {
                if ("com.google.android.finsky".contentEquals(event.getPackageName())) {
                    if ("com.google.android.finsky.activities.IabActivity".contentEquals(event.getClassName())) {
                        final List<AccessibilityNodeInfo> accessibilityNodeInfosByViewId = event.getSource().findAccessibilityNodeInfosByViewId("<package name>:id/<control id>"); // find by layout inspector
                        if (accessibilityNodeInfosByViewId.size() > 0) {
                            accessibilityNodeInfosByViewId.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                        }
                    }
                }
            }
        }
    });
    uiAutomation.connect();
    //release when exit
    uiAutomation.disconnect();
于 2020-07-13T09:28:14.577 回答