Appium Appium 主从远程控制执行

testly · 2015年04月13日 · 最后由 jh 回复于 2018年12月04日 · 4209 次阅读
本帖已被设为精华帖!

1,首先大家先看下面这段,大家应该都知道要能使 Appium 运行起来必须先配置好相关的参数;
这是我个人的代码,有点丑勿见怪


    public void setUp() throws Exception{

//启动

            //  set up appium  
            //  File classpathRoot = new File(System.getProperty("user.dir"));  
            //  File appDir = new File(classpathRoot, "apps");  
            //  File app = new File(appDir, "ContactManager.apk");  
                DesiredCapabilities capabilities = new DesiredCapabilities(); 
                capabilities.setCapability("device","Android");
            //    capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
                capabilities.setCapability("deviceName", "xiaomi-mi_3-02214788");//小米
            //    capabilities.setCapability("deviceName", "52c7c049");//三星
            //    capabilities.setCapability("deviceName", "614ad249");//红米
                capabilities.setCapability("platformVersion", "4.4.4");  
                capabilities.setCapability("platformName", "Android");  
            //    capabilities.setCapability("app", app.getAbsolutePath());
                capabilities.setCapability("appPackage", "com.tencent.mm");  
                capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");
             /*   capabilities.setCapability("unicodeKeyboard", "True");  
                capabilities.setCapability("resetKeyboard", "True");  */
                driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
              //进入发现页面


2,大家看完之后留意下这个地方:

driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

这个里面这个 url:http://127.0.0.1:4723/wd/hub 就是本机开辟的一个 4723 的端口去与 Appium 交互的,知道这个很重要,因为我们这次就会用到它
拿到这段 url 后我们去用浏览器打开看一下这个:

如果出现这个的话证明 4723 端口开辟成功是成功的,当然你的 Appium server 肯定先开着

3,用另外一台机器改一下他的 appium server Address :

改完运行:

运行成功后回到原来的主机 打开浏览器输入:之前设置的 appium server Address,出现下面的

如果是这样的话,那证明你配置成功咯!!

4,接下来就是运行 Case 啦,到主机上面随便找一个脚本只需要更改一个地方


    public void setUp() throws Exception{

//启动

            //  set up appium  
            //  File classpathRoot = new File(System.getProperty("user.dir"));  
            //  File appDir = new File(classpathRoot, "apps");  
            //  File app = new File(appDir, "ContactManager.apk");  
                DesiredCapabilities capabilities = new DesiredCapabilities(); 
                capabilities.setCapability("device","Android");
            //    capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
                capabilities.setCapability("deviceName", "xiaomi-mi_3-02214788");//小米
            //    capabilities.setCapability("deviceName", "52c7c049");//三星
            //    capabilities.setCapability("deviceName", "614ad249");//红米
                capabilities.setCapability("platformVersion", "4.4.4");  
                capabilities.setCapability("platformName", "Android");  
            //    capabilities.setCapability("app", app.getAbsolutePath());
                capabilities.setCapability("appPackage", "com.tencent.mm");  
                capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");
             /*   capabilities.setCapability("unicodeKeyboard", "True");  
                capabilities.setCapability("resetKeyboard", "True");  */
                                //改这里
                driver = new AndroidDriver(new URL("http://172.17.6.173:4723/wd/hub"), capabilities);
              //进入发现页面


改好后各项参数都对应起来点击运行一个普通的 case,你会发现你的另外一台机器上的设备自动运行起来了!!!!

你可以把这个 url 封装起来然后开多个虚拟机和多版本的模拟器进行并发分布式测试!具体方法以后分享
祝大家成功!
有什么问题随便时找我!

欢迎一起交流,一起进步 可以关注我的微信公众号:

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

你终于发现了啊. 楼主是第一个发现这个技巧并分享出来的人, 赞
我希望可以做的更好些. 比如把测试用例编译到 app 中, 然后手机上运行, selendroid 貌似是可以做到的. 这样可以绕过 tcp 传输 更稳定. 不过这个难度太大. 相当于安装卸载基本已经无法控制了. 或者要失效

还有一个疯狂的想法是把所有的 android 的 4723 端口反弹到云端的服务器上. 然后用 adb connect 所有的端口, 最后通过一个 appium 来控制. 我干过, 可行.

#1 楼 @seveniruby 哈哈,这样可以吗?omygod

#1 楼 @seveniruby 是一台服务器上 connect 所有端口?不会出错吗?怎么控制顺序呢

#3 楼 @testly adb 本来就是可以控制多个手机的. 反弹端口是一种形式 用 *** 让所有的手机和电脑处于同一局域网也可以.

我上次也是这样弄的,只是忘记改服务器的地址了,
明天我试下是否可以成功。

这个就是 WebDriver 的 RemoteDriver 的特性吧。Appium 本质上是一个 RemoteDriver(最早的时候它的 client 用的就是 RemoteDriver)。只要网络能联通,client 与 server 之间无论是否在同一台机器上都没问题的。
如果是用其他 webdriver(如 ChromeDriver),也可以用 SeleniumRC 来作为远程服务器,然后 client 连去服务器进而控制远程机器的 webdriver。

#6 楼 @chenhengjie123 理解透彻!赞

#4 楼 @seveniruby 我也正在弄这个、不过还没考虑到 ***、我得去试试

今天测试了下,不成功,楼主因该是在同一台电脑上试的。我在两台电脑上按楼主的方式操作,运行报错。
could not start a new seesion. Possible causes are invalid address of the remote server or browser start-up failure.

testly #13 · 2015年04月14日 Author

#9 楼 @springs412 我是两台电脑哦,你的设备接在从机么?参数什么都配好了么。另外一台机器的配置?

#10 楼 @testly
1。172.17.6.173 的 IP 是从机的 IP,还是主机的 IP?
2。两台电脑上都启动 appium 的服务器还是只是在从机上启动 appium 服务器?

#11 楼 @springs412 你先确认一下从主机访问从机的入口(如http://172.17.6.173:4723/wd/hub172.17.6.173是从机地址)看能否访问?
如果不行,检查一下网络(防火墙、是否在同一网络等)

appium server 在从机打开就好了。

成功了,其实挺简单的,从机启 appium 服务器和接手机,主机运行脚本,但是最好先跑简单例子,
我犯了一个错,就是我要主机运行的脚本里有带安装 apk 包,而从机上这个对应的地址没有 apk 包,所以就跑不起来。报错总提示说要用远程服务器,误导我了。

这个http://127.0.0.1:4723/wd/hub 的故事楼主可以讲一下吗?

testly #16 · 2015年04月15日 Author

#15 楼 @shero 你可以理解为这是一个开辟的服务端口,他的作用是 code 与 appium 服务之间的交互

这个方法可以用在两台设备之间的联动测试吗?

testly #18 · 2015年04月16日 Author

联动测试?怎么个联动呢?老乡!

19楼 已删除

如果多个主机同时连接从机进行测试,且从机上已连接了多个手机,脚本里面也设置了相应的手机的 udid,从机的 appium 服务器是否能正常工作?

testly #21 · 2015年04月17日 Author

#20 楼 @mildshark 可以的啊,指定 udid 就可以!

#18 楼 @testly 就是两台设备之间的联动。最近在做一个 ios 设备控制安卓设备的项目,粗略试验了下,貌似可行,不知道会不会有坑。两台电脑分别连接两台设备,然后脚本在主机上运行。

testly #23 · 2015年04月21日 Author

#22 楼 @shixue33 这样是可以的的啊。每台开一个端口给对方用

如果 appium Server 在 MAC 上需要执行 http://*.*.*.*:4723/wd/hub/status,如果不加 status 会提示 404。早上刚试了一下。

testly #26 · 2015年04月22日 Author

#24 楼 @dragonszh 换成 127.0.0.1 呢

最终走的是 Selenium Grid

#1 楼 @seveniruby 你的疯狂想法方案,是通过一个 appium 控制用例在多台设备逐一运行的,还是可以对多台设备同时执行用例?

#27 楼 @cywin 我最近看了 appium 的多 session,发现他并没有做好。 一个 appium 实例肯定是不行的。 需要多个 appium server。

#28 楼 感谢@lihuazhang 如果这样的话,看来只能逐一运行了

testly #32 · 2015年04月28日 Author

#29 楼 @cywin 可以并行,开多个 server

#27 楼 @cywin @lihuazhang @testly 我有时候觉得反过来反而更好。 agent 不是接受请求, 而是主动去连接询问是否有要求。这样的架构可以突破网络限制。

#30 楼 @testly 有木有 appium+ios+jenkins+java 的方案啊?

testly #34 · 2015年06月04日 Author

#32 楼 @rabbit 这个 方案不难啊!自己先查查,我暂时还没写

#1 楼 @seveniruby “把所有的 android 的 4723 端口反弹到云端的服务器上. 然后用 adb connect 所有的端口, 最后通过一个 appium 来控制 ”。。。这个方法我很有兴趣,能说得稍微想详细点么,目前有大量设备的并发测试需求 相当的头疼,这个方法感觉能解决我的问题,求指教!

有个问题,如果从机为 windows, 主机为 mac , 在从机发送指令至主机时,如果带 app 参数,其服务端处理时使用的 path 为 mac 的路径 + 发送过去的 app_path ,这个什么办法吗

testly #37 · 2015年06月25日 Author

#35 楼 @sylar 为什么要服务端处理时使用的 path 为 mac 的路径 + 发送过去的 app_path 呢?

#35 楼 @sylar 我也遇到了这个问题,楼主的回复没看懂,问下老兄你解决这个问题了吗

#37 楼 @hobbs 在 windows 上架了个 tomcat,把 app 的文件路径配置成 http 开头的网络路径

http://127.0.0.1:4723/wd/hub 打不开,是什么问题造成的呢?appium 已经启动了

#34 楼 @wang04170 我也是打算这么测试,你这个问题解决了吗?

#1 楼 @seveniruby 一直在解决一个 appium 控制多个真机运行的问题,你那个方法能不能详细给介绍一下?

#41 楼 @fullsen 我最近也遇到这问题了,老兄你解决了没,能否指教

—— 来自 TesterHome 官方 安卓客户端

其他的都可以,但是我启动虚拟机 Appium 点击 Strat 后会自动停止服务。
尝试连接本机(本机 appium 已启动)时,虚拟机总是报这个错误。
error: Couldn't start Appium REST http interface listener.
但是远程虚拟机开 192.x.x.x/4723 是可以访问我本地的。
请问有哪位大神知道是什么情况吗?

testly #44 · 2016年08月02日 Author

#43 楼 @testercc 自动停止服务?我可以理解为 launch 不起来么?换个端口试试呢?
或者你可以报错信息可以贴一下。

日落。 回复

我加了 status 也不行啊,反向 windows 作为 server,mac 倒可以跟 windows 连得上。
有没有可能是 mac 的 4723 端口权限问题?还是还要做什么设置?

xdlhy Appium 并发和主从远程控制 中提及了此贴 09月18日 18:35
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册