Appium 基于 uiautomator2.0 server, 通过 nginx 来访问网内的其他手机

bauul · 2017年04月25日 · 最后由 陈子昂 回复于 2017年04月27日 · 1483 次阅读

缘由

最近搞 android toast 消息验证,看了一下 uiautomator2.0 server 的源代码,启动 uiautomator2.0 server 后,可以通过 post 请求来执行自动化测试

启动 server

adb shell am instrument -w io.appium.uiautomator2.server.test/android.support.test.runner.AndroidJUnitRunner

post/get 源码

private void registerPostHandler() {
        register(postHandler, new NewSession("/wd/hub/session"));
        register(postHandler, new FindElement("/wd/hub/session/:sessionId/element"));
        register(postHandler, new FindElements("/wd/hub/session/:sessionId/elements"));
        register(postHandler, new Click("/wd/hub/session/:sessionId/element/:id/click"));
        register(postHandler, new Click("/wd/hub/session/:sessionId/appium/tap"));
        register(postHandler, new Clear("/wd/hub/session/:sessionId/element/:id/clear"));
        register(postHandler, new RotateScreen("/wd/hub/session/:sessionId/orientation"));
        register(postHandler, new RotateScreen("/wd/hub/session/:sessionId/rotation"));
        register(postHandler, new PressBack("/wd/hub/session/:sessionId/back"));
        register(postHandler, new SendKeysToElement("/wd/hub/session/:sessionId/element/:id/value"));
        register(postHandler, new SendKeysToElement("/wd/hub/session/:sessionId/keys"));
        register(postHandler, new Swipe("/wd/hub/session/:sessionId/touch/perform"));
        register(postHandler, new TouchLongClick("/wd/hub/session/:sessionId/touch/longclick"));
        register(postHandler, new OpenNotification("/wd/hub/session/:sessionId/appium/device/open_notifications"));
        register(postHandler, new PressKeyCode("/wd/hub/session/:sessionId/appium/device/press_keycode"));
        register(postHandler, new LongPressKeyCode("/wd/hub/session/:sessionId/appium/device/long_press_keycode"));
        register(postHandler, new Drag("/wd/hub/session/:sessionId/touch/drag"));
        register(postHandler, new AppStrings("/wd/hub/session/:sessionId/appium/app/strings"));
        register(postHandler, new Flick("/wd/hub/session/:sessionId/touch/flick"));
        register(postHandler, new ScrollTo("/wd/hub/session/:sessionId/touch/scroll"));
        register(postHandler, new MultiPointerGesture("/wd/hub/session/:sessionId/touch/multi/perform"));
        register(postHandler, new TouchDown("/wd/hub/session/:sessionId/touch/down"));
        register(postHandler, new TouchUp("/wd/hub/session/:sessionId/touch/up"));
        register(postHandler, new TouchMove("/wd/hub/session/:sessionId/touch/move"));
        register(postHandler, new CompressedLayoutHierarchy("/wd/hub/session/:sessionId/appium/device/compressedLayoutHierarchy"));
        register(postHandler, new NetworkConnection("/wd/hub/session/:sessionId/network_connection"));
    }

    private void registerGetHandler() {
        register(getHandler, new Status("/wd/hub/status"));
        register(getHandler, new CaptureScreenshot("/wd/hub/session/:sessionId/screenshot"));
        register(getHandler, new GetScreenOrientation("/wd/hub/session/:sessionId/orientation"));
        register(getHandler, new GetRotation("/wd/hub/session/:sessionId/rotation"));
        register(getHandler, new GetText("/wd/hub/session/:sessionId/element/:id/text"));
        register(getHandler, new GetElementAttribute("/wd/hub/session/:sessionId/element/:id/attribute/:name"));
        register(getHandler, new GetSize("/wd/hub/session/:sessionId/element/:id/size"));
        register(getHandler, new GetName("/wd/hub/session/:sessionId/element/:id/name"));
        register(getHandler, new Location("/wd/hub/session/:sessionId/element/:id/location"));
        register(getHandler, new GetDeviceSize("/wd/hub/session/:sessionId/window/:windowHandle/size"));
        register(getHandler, new Source("/wd/hub/session/:sessionId/source"));
        register(getHandler, new GetToastMessage("/wd/hub/session/:sessionId/getPostMsg"));//add by carl
    }

反向代理(这里是一个 get 请求反向代理的 demo)

因为 adb forward 的只是一个端口号,所以仅仅能通过 localhost 或 127.0.0.1 访问,网内其他用户无法访问,通过反向代理就可以实现其他用户访问了,从而达到共享手机的目的


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8201;
    server_name  http://10.24.108.125;

        #charset koi8-r;

    location /wd/hub/status {
        proxy_pass http://localhost:8201/wd/hub/status;
    }
}

这样就可以在网内访问这台手机,执行自动化测试了,就是每个路由都要写出来。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复 时间 点赞

个人觉得这个很有搞头啊😈

外网需要服务器啊,这个成本还是挺高的。。。外网可以使用一个 docker 服务部署代理,有免费的。考虑安全问题应该谨慎。

appium 就是这么搞的吧. pc 端的 api 请求发到 appium, appium 转给了 uiautomator2 server. 你的 nginx 就类似于 appium 的位置了.
你的反向代理貌似没写转发的配置吧, 只有一个 status 的转发配置

就是 appium 的源码,我的标签也选 的 appium,因为 adb forward 的只是一个端口号,所以仅仅能通过 localhost 或 127.0.0.1 访问,网内其他用户无法访问,通过反向代理就可以实现其他用户访问了,从而达到共享手机的目的

我之前在书里写过这个。。

恒温 回复

哪个书啊,那能说明啥,所见略同?😈

bauul 回复

你的思路不错 不过还有个捷径 绕过 pc 直接访问手机的 ip 就可以了 利用 adb wifi 功能

嗯,无线 adb 也可以的,之前也有用过,不过受限 WIFI,普通 WIFI 只能连 10~15 台设备

哎,appium 没用过,只用过 adb forward 重定向是只有 1 个端口号的。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册