如题,尝试做 appium 多设备并发,但是需要手动去开启 appium 服务,怎么在 python 代码里实现新开一个终端窗口开启 appium 服务呀
这种问题,随便搜索一下都可以吧?
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))
我测试过程中发现需要开两个终端窗口开启新进程,两台 iOS 设备才能并发运行,所以想问一下,怎么用脚步开启一个新窗口进程启动服务
我是 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();
}
}
}