You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Robot Framework的.robot文件执行含类的.py文件并创建关键字

Robot Framework集成Python类并执行启动应用脚本

下面是将你的launch_app.py集成到Robot Framework的具体步骤,包含关键字创建和必要配置:

一、基础准备

  1. 确保launch_app.py、config.py、locators.py放在Robot脚本的同目录下,或者将其所在目录添加到Robot的搜索路径(可通过--pythonpath参数指定)。
  2. 确认依赖库已安装:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:55:32