求助:如何通过atomac.launchAppByBundlePath启动FileMaker 13 Advanced?
解决Atomac启动FileMaker 13 Advanced的问题
针对你遇到的bundle ID冲突、启动报错等问题,我整理了可行的解决思路和方案:
一、最稳妥的临时方案:通过PID获取App引用
你提到的atomac.getAppRefByPid方法是目前最可靠的 workaround,这里给你完善一下具体实现:
import subprocess import atomac import time import psutil # 1. 用系统命令启动FileMaker 13 Advanced subprocess.run(["open", "/Applications/FileMaker Pro 13 Advanced/FileMaker Pro Advanced 13.app"]) # 等待App完全加载(根据实际情况调整等待时间) time.sleep(3) # 2. 查找App的PID target_pid = None for proc in psutil.process_iter(["name", "exe"]): try: if "FileMaker Pro Advanced 13" in proc.name(): target_pid = proc.pid break except (psutil.NoSuchProcess, psutil.AccessDenied): continue # 3. 通过PID获取Atomac的App引用 if target_pid: fm_app = atomac.getAppRefByPid(target_pid) print(f"成功连接到FileMaker 13 Advanced(PID: {target_pid})") # 接下来就可以用fm_app开展自动化测试了 else: print("未找到FileMaker 13 Advanced的进程")
这种方式绕开了bundle ID冲突和路径启动的bug,让系统先处理App启动,再挂钩到运行中的进程,稳定性拉满。
二、为什么之前的尝试都失败了
给你拆解下每个方法失效的原因:
- Bundle ID冲突问题:FileMaker 13和16 Advanced共用同一个bundle ID
com.filemaker.client.advanced12,用launchAppByBundleId时,macOS默认会启动该ID关联的最新版本App,所以才会打开16而非13。 - 修改Info.plist后启动失败:修改App的
Info.plist里的bundle ID会破坏macOS的代码签名,Atomac依赖合法签名的App才能通过bundle ID启动,所以修改后的App会被系统阻止。 - 路径启动报错:
ValueError: NSInvalidArgumentException是Atomac对老版本Cocoa/Carbon App(比如FileMaker 13)的已知兼容性问题,库内部的OC对象交互在直接通过路径启动时,会触发缺失的count方法调用错误。
三、可选进阶方案:修复Bundle ID启动(适合有开发基础的用户)
如果你执意想用bundle ID启动,可以尝试修复代码签名问题:
- 复制FileMaker 13 Advanced App到新路径,比如
/Applications/FileMaker Pro 13 Advanced-Copy.app - 修改副本的
Info.plist,将CFBundleIdentifier设为唯一值(比如com.filemaker.client.advanced13) - 用
codesign命令重新签名副本(没有开发者证书的话,可以用临时签名):codesign --force --deep --sign - /Applications/FileMaker Pro 13 Advanced-Copy.app - 现在就可以用新的bundle ID启动了:
atomac.launchAppByBundleId('com.filemaker.client.advanced13')
不过这个步骤比较繁琐,还需要终端操作,所以大部分测试场景下,PID方法会更省心。
内容的提问来源于stack exchange,提问作者Keith John Hutchison
相关产品推荐
相关产品推荐

