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

Robot Framework API测试包初始化问题:自定义关键字无法访问

解决Robot Framework自定义包中暴露Robot关键字的问题

已成功实现将SendGETRequest关键字从ApppRobotFrameworkApiPackage包中暴露,其他测试项目通过pip install安装包后即可直接使用该关键字。以下是实现细节:

项目结构

ApppRobotFrameworkApiPackage/ 
├── __init__.py 
└── Resources/
     └── robot_resources/
          └── custom_keywords.robot

关键实现步骤

1. 在__init__.py中加载Robot资源并暴露关键字

通过Robot Framework的TestSuite API加载自定义关键字资源文件,将关键字绑定到包类的实例属性上,同时通过__all__声明可导出的成员:

import sys
from robot.api import TestSuite
from robot.libraries.BuiltIn import BuiltIn
sys.path.append('/Users/samuelcheng/Documents/Atlantis-Robotframework-Package/ApppRobotFrameworkApiPackage/')

class ApppRobotFrameworkApiPackage:
    def __init__(self, portal=None, useFiddlerProxies=False, *otherSettings):
        global proxies
        global url
        global cookiesTemplate
        global headersTemplate
        global endpointPreflight

        portalOptions = ["test", "Werknemersportaal", "KCC Inkijk"]
        if useFiddlerProxies:
            proxies = {'http': "127.0.0.1:8888", 'https': "127.0.0.1:8888"}
        else:
            proxies = None
        if portal in portalOptions:
            # 不同portal的配置逻辑
            if portal == 'Werknemersportaal':
                url = "https://test-netcore.otod.t-dc.ba.test.nl"
                cookiesTemplate = {'(.AspNetCore.Antiforgery.[a-zA-Z0-9=_-]*)': None, 'EWSESSION-T': None,
                                   'EWSESSION-T_S': None, 'XSRF-TOKEN': None}
                headersTemplate = {'XSRF-TOKEN': None, 'X-XSRF-TOKEN': None,
                                   'Content-Type': 'application/json;charset=UTF-8'}
                endpointPreflight = "/kias/mijnbezwaar/api/bezwaarschriften/getcurrentbezwaarschrift"
            elif portal == 'test':
                url = "https://test.otod.t-dc.ba.test.nl"
                cookiesTemplate = {'ASP.NET_SessionId': None, 'WerkgeverSamlAuthT': None, 'WerkgeverSamlAuthT1': None,
                                   '__FiscaalNummer': otherSettings[0], '__SelectedWerkgeverNaam': otherSettings[1]}
                endpointPreflight = "/bezwaarenberoep/api/bezwaar/getbezwaarschriften"
            elif portal == "KCC Inkijk":
                url = "https://test-netcore.otod.t-dc.ba.test.nl"
                cookiesTemplate = {'(.AspNetCore.Antiforgery.[a-zA-Z0-9=_-]*)': None, 'KCCINKIJK': None,
                                   'XSRF-TOKEN': None}
                headersTemplate = {'X-XSRF-TOKEN': None, 'Content-Type': 'application/json;charset=UTF-8'}
            else:
                BuiltIn().log_to_console(
                    str(portal) + " is not a valid portal for this package. \nCurrently the available portals are: " + str(
                        portalOptions))

            self._requests_library = None

            # 加载自定义关键字资源
            self.suite = TestSuite()
            resource_path = "ApppRobotFrameworkApiPackage/Resources/robot_resources/custom_keywords.robot"
            self.suite.resource.imports.library(resource_path)

            # 将关键字绑定到类实例
            self.SendGETRequest = self.suite.resource.keywords["SendGETRequest"]
            BuiltIn().log_to_console("SendGETRequest keyword:", self.SendGETRequest)
            sys.stdout.flush()
            
            # 声明可导出的成员,支持直接导入
            __all__ = [
                "ApppRobotFrameworkApiPackage",
                "SendGETRequest"
            ]

    def get_requests_library(self):
        # 单例获取RequestsLibrary实例,维持会话状态
        if self._requests_library is None:
            self._requests_library = BuiltIn().get_library_instance('RequestsLibrary')
        return self._requests_library

2. 自定义关键字实现(custom_keywords.robot)

关键字中直接使用包初始化时设置的全局变量(如url、proxies),并封装GET请求逻辑:

*** Settings ***
Library     RequestsLibrary
Library     OperatingSystem
Library     JSONLibrary
Library     DatabaseLibrary
Library     Collections

*** Keywords ***
SendGETRequest
    [Arguments]    ${endpoint}    ${headers}
    Create Session    mysession    ${url}    proxies=${proxies}
    ${response}=    Get Request    mysession    ${endpoint}    headers=${headers}    expected_status=anything
    Set Suite Variable    ${response}
    ${status}    ${response_body}=    Run Keyword And Ignore Error    Evaluate    json.dumps(${response.json()})
    Run Keyword If    '${status}' == 'FAIL'    Set Variable    ${response_body}    '{}'
    Set Suite Variable    ${response_body}
    [Return]    ${response}

关键注意点

  • 资源路径正确性:加载custom_keywords.robot时的路径需能被Python识别,可通过sys.path添加包根目录解决路径问题。
  • 全局变量作用域:url、proxies等全局变量在包初始化时配置,供Robot关键字直接调用。
  • Requests库单例处理:通过get_requests_library方法保证测试会话中使用同一个RequestsLibrary实例,维持会话状态一致性。

内容的提问来源于stack exchange,提问作者Wai Chun Cheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:53:11