如何使用 appium 自动化 webview facebook 登录

Howto automate webview facebook login with appium

我正在尝试在 node.js 中编写一个 appium 功能测试。 当我切换到 webdrivers 上下文时,问题就来了。

这是我的上下文:

[ 'NATIVE_APP', 'WEBVIEW_com.******.***.development' ]

这是测试用例代码:

   "use strict";

    var wd = require("wd");

    require('colors');
    var chai = require("chai");
    var chaiAsPromised = require("chai-as-promised");
    chai.use(chaiAsPromised);
    var should = chai.should();
    chaiAsPromised.transferPromiseness = wd.transferPromiseness;

    var wd = require("wd");

    describe("android simple", function () {
        this.timeout(300000);
        var driver;
        var allPassed = true;

        before(function () {
            driver = wd.promiseChainRemote({
            host: 'localhost',
            port: 4723
        });

        driver.on('status', function (info) {
            console.log(info.cyan);
        });
        driver.on('command', function (meth, path, data) {
            console.log(' > ' + meth.yellow, path.grey, data || '');
        });
        driver.on('http', function (meth, path, data) {
            console.log(' > ' + meth.magenta, path, (data || '').grey);
        });

        var desired = {
            'browserName': '',
            'appium-version': '1.3',
            'platformName': 'Android',
            'platformVersion': '4.4.2',
            'deviceName': 'Android Emulator',
            'app': "path/to/apk"
        };

        return driver
            .init(desired)
            .setImplicitWaitTimeout(3000);
    });

    after(function () {
        return driver
            .quit()
            .finally(function () {
                if (process.env.SAUCE) {
                    return driver.sauceJobStatus(allPassed);
                }
            });
    });

    afterEach(function () {
        allPassed = allPassed && this.currentTest.state === 'passed';
    });

    it("should find facebook login button", function () {

        return driver
            .elementById('facebook_login_button')
            .click()
            .sleep(10000)
            .contexts()
            .then(function (ctxs) {
                console.log(ctxs);
                return driver.context(ctxs[ctxs.length - 1]);
            })
           .elementByName('email')
           .sendKeys('test.*****@gmail.com')
           .sleep(5000)
           ;
    });
});

并且appium服务器的输出错误:

错误:Chromedriver:错误:处理命令时发生未知的服务器端错误。 (原报错:unknown error: Device emulator-5554 is not online (驱动信息: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d8c96a94682a),platform=Windows NT 10.0 x86_64)) 在 JWProxy.command$ (lib/proxy.js:149:15) 在 tryCatch 状态:13, 价值:{消息:'unknown error: Device emulator-5554 is not online\n (Driver info: chromedriver=2.18.343845 (73dd713ba7fbfb73cbb514e62641d8c96a94682a),platform=Windows NT 10.0 x86_64)'}, http代码:200}

提前致谢。

尝试不同的 android 设备,问题是 adb 返回带有设备名称的额外字符。看 https://github.com/appium/appium/issues/5686

我终于解决了这个问题。这只是一个 chromedriver 错误。更新到2.20版,一切正常。

Github 问题: https://github.com/appium/appium/issues/5616

Chrome 驱动程序发行说明: https://sites.google.com/a/chromium.org/chromedriver/downloads