如何使用Robot Framework的.robot文件执行含类的.py文件并创建关键字
Robot Framework集成Python类并执行启动应用脚本
下面是将你的launch_app.py集成到Robot Framework的具体步骤,包含关键字创建和必要配置:
一、基础准备
- 确保
launch_app.py、config.py、locators.py放在Robot脚本的同目录下,或者将其所在目录添加到Robot的搜索路径(可通过--pythonpath参数指定)。 - 确认依赖库已安装:
pip install robotframework pywinauto
二、方案1:直接在Robot文件中调用Python类
这种方式无需额外编写中间文件,直接在.robot脚本中导入并调用LaunchApp类:
创建Launch_App_Test.robot文件:
*** Settings *** Documentation 自动化启动应用并完成登录的测试脚本 Library launch_app.py ${DETRANSIT_EXE_PATH} # 导入Python类,传入初始化参数 *** Variables *** ${DETRANSIT_EXE_PATH} C:\\Your\\Actual\\Path\\detransit.exe # 替换为实际应用路径,或直接引用config.py中的变量 *** Test Cases *** Verify App Launch And Sign In Execute App Launch And Sign In *** Keywords *** Execute App Launch And Sign In # 获取导入的LaunchApp类实例 ${app_launcher}= Get Instance # 调用类中的launchApp方法 Call Method ${app_launcher} launchApp
关键说明:
Library launch_app.py ${DETRANSIT_EXE_PATH}:直接导入Python类,后面的参数对应LaunchApp的__init__方法参数。Get Instance:Robot内置关键字,用于获取导入类的实例。Call Method:调用实例的指定方法(这里是launchApp)。
三、方案2:封装Python关键字库(更灵活)
如果需要扩展更多关键字,或者想让逻辑更清晰,可以编写一个专门的关键字封装文件:
创建app_keywords.py:
from launch_app import LaunchApp from config import detransitPath class AppKeywords: # 设置全局作用域,避免测试用例重复初始化类 ROBOT_LIBRARY_SCOPE = 'GLOBAL' def __init__(self): # 初始化LaunchApp实例 self.launcher = LaunchApp(detransitPath) def launch_and_sign_in_to_application(self): """Robot Framework关键字:启动应用并完成登录操作""" # 调用launchApp方法 self.launcher.launchApp() # 若需要返回app实例供后续操作,可添加return self.launcher.app
然后在.robot文件中导入这个关键字库:
*** Settings *** Documentation 自动化启动应用的测试脚本 Library app_keywords.py *** Test Cases *** Test App Launch Flow Launch And Sign In To Application
四、优化建议(避免全局变量问题)
原launch_app.py中的全局app变量存在线程安全风险,建议修改为实例属性:
# 修改后的launch_app.py from pywinauto.timings import TimeoutError, wait_until from pywinauto import application from config import detransitPath import time class LaunchApp: def __init__(self, detransitPath): self.detransitPath = detransitPath self.app = None # 用实例属性替代全局变量 def launchApp(self): self.app = application.Application(backend="uia").start(self.detransitPath) from locators import signinWindow, signinButton, transitUI # 注意:locators.py中的控件定位需基于self.app实例,例如signinWindow = self.app.window(title="登录") signinWindow.print_control_identifiers(depth=10) wait_until(timeout=10, retry_interval=0.7, func=lambda: signinWindow.exists()) signinButton.click_input() wait_until(timeout=17, retry_interval=0.7, func=lambda: transitUI.exists()) return self.app # 返回app实例,方便后续操作
这样修改后,你可以在Robot关键字中获取返回的app实例,用于后续的控件交互操作。
内容的提问来源于stack exchange,提问作者Nithish Duraikannan
相关产品推荐
相关产品推荐

