Appium 基于 selenium grid 连接多个 appium

测试小书童 · November 11, 2016 · Last by litianping replied at December 06, 2016 · 3059 hits
本帖已被设为精华帖!
  • 想同时启动多个appium并行运行,谷歌后,很多资料都显示用selenium grid 的方式。找到一张效果图

实践步骤

下载selenium-server-standalone-xxx.jar

  • 执行命令
java -jar selenium-server-standalone-3.0.1.jar  -port 4444 -role hub

设置不同的端口appium json文件信息

  • 配置json1 端口4723文件
{
"capabilities": [
{
"deviceName": "DU2TAN15AJ049163",
"version": "4.4.2",
"maxInstances": 3,
"platform": "ANDROID",
"browserName": "chrome"
}
],
"configuration": {
"cleanUpCycle": 2000,
"timeout": 300000,
"browserTimeout": 60000,
"hub":"127.0.0.1:4444/grid/register",
"host":"192.168.1.218",
"maxSession": 6,
"port": 4723,
"hubPort": 4444,
"hubHost": "192.168.1.218",
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url": "http://127.0.0.1:4723/wd/hub",
"register": true,
"registerCycle": 5000
}
}
  • 执行命名,启动端口4723连接hub
node D:\\app\Appium\\node_modules\\appium\\bin\\appium.js  -p 4723  -U DU2TAN15AJ049163 --nodeconfig D:\app\appium_study\testRunner\test.json

  • 配置json2 ,端口为 4724
{
"capabilities": [
{
"deviceName": "MSM8926", #设备id
"version": "4.3",
"maxInstances": 3,
"platform": "ANDROID",
"browserName": "chrome"
}
],
"configuration": {
"cleanUpCycle": 2000,
"timeout": 300000,
"browserTimeout": 60000,
"hub":"127.0.0.1:4444/grid/register", #链接hub
"host":"192.168.1.218",
"maxSession": 6,
"port": 4724,#端口号
"hubPort": 4444,
"hubHost": "192.168.1.218",
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url": "http://127.0.0.1:4724/wd/hub",# 4724 appium服务器
"register": true,
"registerCycle": 5000
}
}
  • 执行命名,启动端口4724连接hub
node D:\\app\Appium\\node_modules\\appium\\bin\\appium.js  -p 4724  -U MSM8926--nodeconfig D:\app\appium_study\testRunner\test2.json

在看看刚刚执行selenium-server-standalone窗口

在浏览器中预览

在浏览器输入:http://192.168.1.218:4444/grid/console 就能看到你连接了多少个设备

其他

  • 这种方式也可以启动多个web 浏览器的方式,用于多个web自动化测试
  • 关于代码对接,还没有对接成功到代码中,如何启动不同的driver,不同的driver放到线程中,现在还没有想好怎么做比较好,有其他想法的小伙伴麻烦帮忙指导下思路
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 16 条回复 时间 点赞

实现起来不难,贴下我实现的代码吧

  • 1.启动appium,指定appium端口和bootstrap端口与device

def start_appium(self):
"""
启动appium
p:appium port
bp:bootstrap port
:return: 返回appium端口参数
"""


aport = random.randint(4700, 4800)
bpport = random.randint(4700, 4800)
U.cmd("appium -p %s -bp %s -U %s" %
(aport, bpport, self.device)) # 启动appium
U.Logging.success('start appium :p %s bp %s' % (aport, bpport,))
U.sleep(10)
return aport
  • 2.继承步骤1的端口与device,启动driver,需要注意的的是appium偶尔会启动失败,重试即可
def start_appium(self):
"""
启动driver
:return:
"""


number_of_starts = 0
while number_of_starts < 6:
try:
self.driver = webdriver.Remote(
'http://0.0.0.0:%s/wd/hub' %
self.__get_appium_port(), self.device_l)
U.Logging.debug('appium start success')
return self.driver
except Exception as e:
number_of_starts += 1
U.Logging.error('Failed to start appium :{}'.format(e))
U.Logging.error(
'Try restarting the appium,Trying the {} frequency'.format(number_of_starts))
U.sleep(5)
if number_of_starts == 4:
U.Logging.error('Can not start appium, the program exits')
exit()

3.关于多进程,使用multiprocessing,检查设备数量,同时开启每个设备的进程,实现并行测试

import testcase.Integration
from multiprocessing import Pool


def case_sun(device):
a = testcase.Integration.RunApp(device)
a.case_start()


device_list = testcase.Integration.get_device_info()
pool = Pool(len(device_list))
pool.map(case_sun, device_list)
pool.close()
pool.join()

效果图
Alt text

#1楼 @joko 周末我看看,谢谢分享

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

思寒_seveniruby 将本帖设为了精华贴 12 Nov 00:15

加精理由: 对官方的方案进行了实际的探索研究. 内容细致. 感谢@lose@joke

社区拿到了一笔定期赞助. 以后精华帖必有打赏. 你们两个快点搞上.

#1楼 @joko 你好!能方便加下我好友吗?我正在想尝试多设备链接自动化,能教导一下我吗?

#1楼 @joko QQ:476367001

我贴一个PPT

测试小书童 [Topic was deleted] 中提及了此贴 14 Nov 12:49

#1楼 @joko 很好奇你的用例怎么管理的,想和你交流下,看看我的新帖子,有好的意见麻烦帮忙提出来: selenium grid 多进程 (同步,异步) 启动多个 appium

有时间看看,谢谢分享

#9楼 @lose 用例的组织使用的是yaml,支持用例的继承,多重继承。常见的场景也有封装在用例里,例如循环用例,等待等

谢谢分享

#11楼 @joko good,感谢分享经验,现在在做用例基于设备来分配

直接打开两个appium,然后设置不同端口号,实例化Device时连接不同端口号不就可以了吗

#14楼 @wuhao 嗯,这样是可以的

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

appium.cmd --address 127.0.0.1 -p 6666 -bp 10001 --session-override -U 6533d70

你好,我用上面的命令开启多个端口,然后testng传递参数给 脚本,问题就是,只有一个手机跑了,另外的手机 全test ignore

<parameter name="port" value="6666"/>
<parameter name="udid" value="6533d70"/>

#16楼 @litianping 要启动多个进程,看看这个就知道了 appium+python (二) 支持多设备并行

#17楼 @lose 你好,我解决了,初始化放在BeforeClass就可以了

独行数息 第一帖 中提及了此贴 24 Dec 18:09
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up