如何使用Python以编程方式启动和停止Appium Server
解决Jenkins上运行Appium的两个常见问题
Hey there! 作为Python新手能搞定Appium自动化测试还搭了Jenkins,已经超棒啦😉 针对你遇到的两个问题,我给你整理了具体的解决方案:
问题1:Jenkins运行Appium命令后挂起
直接在Jenkins执行appium命令会因为进程占据控制台导致任务一直处于运行状态,解决办法是让Appium后台运行,同时把日志输出到文件方便排查:
Linux/macOS环境:使用
nohup命令让进程脱离终端执行nohup appium -p 4723 -g appium_run.log > /dev/null 2>&1 &解释:
nohup保证进程在Jenkins任务结束后也能继续运行,-p指定端口,-g指定日志文件,最后的&把进程放到后台。Windows环境:使用
start /B命令后台启动start /B appium -p 4723 -g appium_run.log解释:
/B参数让Appium在后台运行,不会弹出新的命令窗口占用Jenkins控制台。
问题2:Python编程式启动Appium Server
Python可以用自带的subprocess模块来启动和管理Appium进程,不需要额外安装依赖,下面是完整的示例代码:
import subprocess import time from appium import webdriver def start_appium_server(port=4723, log_file="appium_server.log"): """启动Appium服务器并返回进程对象""" # 构造Appium启动命令 appium_cmd = ["appium", "-p", str(port), "-g", log_file] # 启动进程,重定向输出避免阻塞主程序 appium_process = subprocess.Popen( appium_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 等待服务器启动完成(可根据机器性能调整等待时间) time.sleep(6) # 可选:检查服务器是否成功启动(通过日志关键字判断) with open(log_file, "r") as f: logs = f.read() if "listener started on port" not in logs: raise RuntimeError("Appium服务器启动失败,请检查日志") return appium_process def run_android_test(): """执行你的Appium自动化测试用例""" desired_caps = { "platformName": "Android", "deviceName": "YourDeviceName", # 替换成你的设备名或模拟器名 "appPackage": "com.your.app.package", # 替换成测试App的包名 "appActivity": "com.your.app.MainActivity", # 替换成测试App的启动Activity "noReset": True # 根据需求调整是否重置App状态 } # 连接Appium服务器 driver = webdriver.Remote(f"http://localhost:4723/wd/hub", desired_caps) # 这里写你的测试逻辑 print("开始执行测试...") # 示例:点击某个元素 # driver.find_element(AppiumBy.ID, "com.your.app:id/button").click() # 测试完成后关闭driver driver.quit() if __name__ == "__main__": appium_proc = None try: # 启动Appium服务器 appium_proc = start_appium_server() print("Appium服务器启动成功") # 执行测试 run_android_test() except Exception as e: print(f"测试过程出错:{str(e)}") finally: # 不管测试成功还是失败,都要关闭Appium服务器 if appium_proc: appium_proc.terminate() appium_proc.wait() print("Appium服务器已关闭")
代码说明:
subprocess.Popen:启动Appium进程,不会阻塞主程序,方便后续执行测试用例。- 等待时间:
time.sleep(6)是给服务器启动留的缓冲时间,你可以根据自己的机器性能调整。 - 进程管理:在
finally块里终止Appium进程,避免测试结束后残留后台进程占用端口。 - 启动校验:通过读取日志关键字确认服务器启动成功,能提前发现问题。
额外提示:
- 在Jenkins上运行时,确保Jenkins用户的环境变量里包含
node和appium(也就是这两个命令能直接在终端执行)。 - 如果需要同时运行多个Appium实例,记得指定不同的端口(比如
-p 4723、-p 4724)。
内容的提问来源于stack exchange,提问作者Pratik Patel
相关产品推荐
相关产品推荐

