【问题标题】:Appium: Handle native alerts using ChromeDriver on AndroidAppium:在 Android 上使用 ChromeDriver 处理本机警报
【发布时间】:2016-05-21 12:19:29
【问题描述】:

Cordova 应用程序,部署到 Android 模拟器。我的应用程序显示了一个通知提示,我想使用 Appium 对其进行测试。 我们正在使用通知插件,在这种情况下它会显示本机通知。我首先只想接受带有空字符串的提示。

我已经测试过,找到确定按钮: var ok = browser.driver.findElement(by.name('Ok')); ok.click(); 错误是找不到 Ok 按钮。

我也试过: var alert = browser.switchTo().alert(); alert.accept(); 这会导致没有警报打开的错误。本案例的appium日志:

info: JSONWP Proxy: Replacing sessionId 09700a539828795c9ea9d583b68b2250 with 483d2b53-eb0a-4ce2-a697-8776dadf6954 info: <-- GET /wd/hub/session/483d2b53-eb0a-4ce2-a697-8776dadf6954/alert_text 200 7.530 ms - 254 info: --> GET /wd/hub/session/483d2b53-eb0a-4ce2-a697-8776dadf6954/alert_text {} info: JSONWP Proxy: Proxying [GET /wd/hub/session/483d2b53-eb0a-4ce2-a697-8776dadf6954/alert_text] to [GET http://127.0.0.1:9515/wd/hub/session/09700a539828795c9ea9d583b68b2250/alert_text] with body: {} info: JSONWP Proxy: Got response with status 200: {"sessionId":"09700a539828795c9ea9d583b68b2250","status":27,"value":{"message":"no alert open\n (Session info: webview=39.0.0.0)\n (Driver info: chromedriver=2.20.353145 (343b531d31eeb933ec778dbc...

有相关的帖子,但没有一个解决方案有效,例如: How to handle native iOS Alerts in Appium using Java how to handle alerts in android using appium

谁能帮我解释一下?

【问题讨论】:

标签: android cordova appium


【解决方案1】:

我恰好遇到了这个问题,最后想出了一个解决方案。

假设您使用的是wd-bridge,首先通过量角器配置在您的测试中将wdBrowser 对象公开为全局对象:

onPrepare: function () {
    var wd = require('wd'),
        protractor = require('protractor'),
        wdBridge = require('wd-bridge')(protractor, wd);
    wdBridge.initFromProtractor(exports.config);
    global.wdBrowser = wdBrowser;
},

然后假设您正在处理的 Cordova 警报是由 cordova-plugin-dialogsnavigator.notification.alert() 生成的,您可以执行以下操作:

function acceptAlert() {
    let webViewContext;

    return wdBrowser
        .currentContext()
        .then((currentContext) => {
            webViewContext = currentContext;
        })
        .context("NATIVE_APP")
        .then(() => {
             return wdBrowser.elementById("android:id/button1").then((el) => {
                  return el.click();
              }, (err) => {
                  console.error("Alert dialog not found");
                  return wdBrowser;
             });
        })
        .then(() => {
            return wdBrowser.context(webViewContext);
        });
};

这个函数:

  • 存储对包含您的 Cordova 应用程序的 Webview 上下文的引用
  • 切换到本机上下文
  • 通过本机 ID 找到本机警报 OK 按钮
  • 点击它
  • 恢复原始 Webview 上下文

所以你可以这样使用它:

acceptAlert().then(() => {
    console.log("Alert accepted");
});

【讨论】:

    猜你喜欢
    • 2014-08-29
    • 2017-01-16
    • 1970-01-01
    • 2015-03-23
    • 2020-01-17
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多