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
相关产品推荐
相关产品推荐

