Appium 并发多设备运行 appium 脚本时怎么实现自动启动 appium 服务

我喜欢的K17 · 2019年11月11日 · 最后由 kasijia 回复于 2019年11月13日 · 3967 次阅读

如题,尝试做 appium 多设备并发,但是需要手动去开启 appium 服务,怎么在 python 代码里实现新开一个终端窗口开启 appium 服务呀

共收到 8 条回复 时间 点赞

这种问题,随便搜索一下都可以吧?

 appium -a 127.0.0.1 -p 4727 -bp 4728  -U xiaomi --session-override
# 先安装appium库,在窗口执行appium返回appium版本就对了
# 多设备的时候,修改-p和-bp端口号就可以了,记住 --session-override 一定要加

如果用的 appium-python-client 库,里面有自带的启动 appium 方法 用法:

from appium.webdriver.appium_service import AppiumService
service = AppiumService()
service.start(args=['--address', '127.0.0.1', '-p', '80'], timeout_ms=2000)
service.stop()

你也可以自己起个窗口 类似

os.system('start appium -p {}'.format(port))
simple 回复

我测试过程中发现需要开两个终端窗口开启新进程,两台 iOS 设备才能并发运行,所以想问一下,怎么用脚步开启一个新窗口进程启动服务

YueChen 回复

我是 Mac 系统,所以 start 命令提示找不到,在 Mac 中有没有类似于 start 命令的指令呀,还有我试了一下自带的 AppiumServer,

service = AppiumService()
service.start(args=['--address', '127.0.0.1', '-p', '4723'], timeout_ms=2000) 一直报错,:

File "/Users/hpcl201901056/Documents/Autotest_platform/Autotest_platform/helper/util.py", line 86, in start_appium
service.start(args=['--address', '127.0.0.1', '-p', '4723'], timeout_ms=2000)
File "/Users/hpcl201901056/Documents/Autotest_platform/venv/lib/python3.6/site-packages/appium/webdriver/appium_service.py", line 159, in start
main_script = kwargs['main_script'] if 'main_script' in kwargs else self._get_main_script()
File "/Users/hpcl201901056/Documents/Autotest_platform/venv/lib/python3.6/site-packages/appium/webdriver/appium_service.py", line 105, in _get_main_script
raise AppiumServiceError(e.output)
appium.webdriver.appium_service.AppiumServiceError: b''

个人建议,你就直接持续跑着 5 个左右的 appium 服务,脚本只需要选择用哪个服务就好,这样也可以并发,而且技术上更简单。当然,要记得脚本里面确保每次执行完毕都结束 session 。

如果要搞用到时启动,你需要了解 python subprocess ,需要知道如何从命令行启动 appium ,需要能监控 appium 服务是否真的启动成功。从你目前的回答看,你对这些方面的知识了解其实并不是很多,所以直接持续开着 appium 服务,脚本只管选择,这个方案可能更适合你。

当然,有一个绕不过的点,那就是你还得知道如何从命令行,而非 appium desktop 启动 appium 服务,否则做不到多开。这方面的知识一楼已经有说过了,建议可以结合社区搜索一下知识理解一下。如果实在还是不理解,可以再发帖说你找到了哪些文章,个人理解是如何和卡在哪里,便于大家协助你。

陈恒捷 回复

我试过 subprocess.Popen 去启动命令,还是不能多进程并发,我的启动代码张这样
def start_appium():
post_num = 4723
wad = 8010
while check_port(post_num):
post_num = post_num + 2
while check_port(wad):
wad = wad + 1
# 根据系统,启动对应的服务
cmd_dict = {
'MAC': f'appium -a 127.0.0.1 -p {post_num} --webdriveragent-port {wad} --log xxx.log --local-timezone & '
}
#os.system(cmd_dict['MAC'])
subprocess.Popen(cmd_dict['MAC'], shell=True)
time.sleep(5) # 等待启动完成
print('appium 启动成功')
return post_num
我之前看文章,Windows 上可以直接用 start /b 去开启新窗口,但是 Mac 没有这个命令,试过 subprocess.Popen 也不行,手动打开终端去开启几个服务这样并发我之前一直上这么做的,现在就想实现用时再启动

mac 想启动命令行窗口可以使用这种方式

os.system("""osascript -e 'tell application "Terminal" to do script "appium -p {}"'""".format(port))

https://www.cnblogs.com/NaCl/p/10172142.html 《Appium 的三种启动方式》
刚开始用 Appium 自带的方法来启动,发现死活找不到设置 bp 端口的方法,所以后来改为第二种方法来实现了。

public class AppiumDriver {
    /**
     * 启动Appium服务
     * @param port
     * @param bp
     */
    public static void startAppiumServer(String port,String bp){
        CommandLine cmd = new CommandLine("/usr/local/bin/node");
        cmd.addArgument("/usr/local/bin/appium");
        cmd.addArgument("-a");
        cmd.addArgument("127.0.0.1");
        cmd.addArgument("-p");
        cmd.addArgument(port);
        cmd.addArgument("-bp");
        cmd.addArgument(bp);

        DefaultExecuteResultHandler handler = new DefaultExecuteResultHandler();
        DefaultExecutor executor = new DefaultExecutor();
        executor.setExitValue(1);

        try {
            executor.execute(cmd, handler);
            Thread.sleep(10000);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭Appium服务
     */
    public static void stopAppiumServer() {
        Runtime runtime = Runtime.getRuntime();
        try {
            runtime.exec("killall node");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册