RobotFramework: 设置Case执行的搜索路径

本文介绍如何使用Python脚本为RobotFramework设置全局环境变量,确保测试过程中能够正确引用库文件和其他资源。
在写Robot Framework 的Case时,我们一般采用的都是相对路径引用我们的lib以及其他资源文件,因此需要给Robot添加一个搜索路径,但是采用命令行和RIDE还有一些差别。

这里举例简单说明一下。
例如:
Import Name/Path
library libName.py

假如,你的lib库放在TestSuite的Libraries文件夹下,你希望通过把这个文件夹添加到PYTHONPATH环境变量中,让Robot在运行时能够能够查找到keyword的python库文件。

但是对于非lib库的具体的一些资源文件,最好是根据其功能分别保存在特定的文件路径下,需要写一个脚本设置Robot对应具体文件夹的全局环境变量。

具体方法:根据当前TestSuite文件所在路径,向上获取对应的资源文件路径,并且设置对应的环境变量。

下面用一个比较典型的例子说明:
加入你执行的Case需要的资源根据目录结构层次展开为多个文件夹,因此可以用一个python脚本来设置这些所需的环境变量,以便于Robot执行时所需。

(代码的显示格式是从MSDN参考过来的,看起来还不错。)



import os
import os.path
import sys
import time
from robot.variables import GLOBAL_VARIABLES

class GlobalEnvSettings:
    def __init__(self):
        """
        GlobalEnvSettings: performs initial test environment setup

        Following global variables are set if corresponding folders exist:
        ${BUILD_ROOT} - path to the build ('C_Test' folder position)
        ${BUILD_BINARIES} - path to the build's binary files
        ${ENV_ROOT} - Robot test environment path
        ${ENV_LIBRARIES} - path to generic test env libraries
        ${ENV_TESTS} - path to test env tests
        ${ENV_VECTORS} - path to test vectors
        ${ENV_MESSAGES} - path to test env messages
        ${ENV_TEMPLATES} - path to test env message templates
        ${ENV_TESTLIBRARIES} - path to test specific libraries
        ${ENV_REPORTPATH} - path to the current report folder

        ENV_LIBRARIES and ENV_TESTLIBRARIES are added to the OS PATH environment variable
        so there is no need to add these paths while importing libraries
        """
        print "Setting up folders and paths"
        v_currentPath =  os.path.abspath(os.path.dirname(__file__))
        v_buildRootPos = v_currentPath.find("Test_Branch_1")
        if v_buildRootPos < 0:
            v_buildRootPos = v_currentPath.find("Test_Branch_2")
            if v_buildRootPos < 0:
                v_buildRootPos = v_currentPath.find("Test_Branch_3")
                if v_buildRootPos < 0:
                    v_buildRootPos = v_currentPath.find("Test_Branch_4")
                    if v_buildRootPos < 0:
                        v_buildRootPos = v_currentPath.find("Test_Branch_5")
                        
        if v_buildRootPos >= 0:
            v_buildRootPath = v_currentPath[:v_buildRootPos].rstrip("\\")
            GLOBAL_VARIABLES["${BUILD_ROOT}"] = v_buildRootPath
            print "Build root: '%s'" % v_buildRootPath
            v_binariesPath = v_buildRootPath + "\\SomePath\\Bin"
            if os.path.exists(v_binariesPath):
                GLOBAL_VARIABLES["${BUILD_BINARIES}"] = v_binariesPath
                print "Build's binaries folder: '%s'" % v_binariesPath
        else:
            raise Exception,'no directory found'
        
        v_testEnvPath = v_currentPath + "\\"
        v_testEnvRootPos = v_testEnvPath.rfind("\\Robot\\")
        if v_testEnvRootPos < 0:
            raise Exception,'no directory found'
        
        v_testEnvRootPos = v_testEnvPath.rfind("\\Robot\\")
        if v_testEnvRootPos >= 0:
            v_testEnvRootPath = v_testEnvPath[:v_testEnvRootPos] + "\\Robot"
            GLOBAL_VARIABLES["${ENV_ROOT}"] = v_testEnvRootPath
            print "Test environment root: '%s'" % v_testEnvRootPath
            v_librariesPath = v_testEnvRootPath + "\\Libraries"
            if os.path.exists(v_librariesPath):
                GLOBAL_VARIABLES["${ENV_LIBRARIES}"] = v_librariesPath
                print "Test environment global libraries folder: '%s'" % v_librariesPath
            v_testsPath = v_testEnvRootPath + "\\Tests"
            if os.path.exists(v_testsPath):
                GLOBAL_VARIABLES["${ENV_TESTS}"] = v_testsPath
                print "Test environment tests folder: '%s'" % v_testsPath
            v_vectorsPath = v_testEnvRootPath + "\\Vectors"
            if os.path.exists(v_vectorsPath):
                GLOBAL_VARIABLES["${ENV_VECTORS}"] = v_vectorsPath
                print "Test environment vectors folder: '%s'" % v_vectorsPath
            v_messagesPath = v_testEnvRootPath + "\\Messages"
            if os.path.exists(v_messagesPath):
                GLOBAL_VARIABLES["${ENV_MESSAGES}"] = v_messagesPath
                print "Test environment messages folder: '%s'" % v_messagesPath
                v_templatesPath = v_messagesPath + "\\Templates"
                if not os.path.exists(v_templatesPath):
                    os.mkdir(v_templatesPath)
                GLOBAL_VARIABLES["${ENV_TEMPLATES}"] = v_templatesPath
                print "Test environment message templates folder: '%s'" % v_templatesPath
            v_testsLibrariesPath = v_testsPath + "\\Libraries"
            if os.path.exists(v_testsLibrariesPath):
                GLOBAL_VARIABLES["${ENV_TESTLIBRARIES}"] = v_testsLibrariesPath
                print "Test environment test libraries folder: '%s'" % v_testsLibrariesPath
            v_testsResourcesPath = v_testsPath + "\\Resources"
            if os.path.exists(v_testsResourcesPath):
                GLOBAL_VARIABLES["${ENV_TESTRESOURCES}"] = v_testsResourcesPath
                print "Test environment test resources folder: '%s'" % v_testsResourcesPath
            if GLOBAL_VARIABLES.has_key("${LOG_FILE}"):
                v_reportPath = os.path.dirname(GLOBAL_VARIABLES["${LOG_FILE}"])
                GLOBAL_VARIABLES["${ENV_REPORTPATH}"] = v_reportPath
                print "Test environment reports folder: '%s'" % v_reportPath
            if v_librariesPath != "":
                sys.path.append(v_librariesPath)
            if v_testsLibrariesPath != "":
                sys.path.append(v_testsLibrariesPath)
        time.clock()


    def dummy_method(self):
        """
        Dummy method to avoid Robot warning that library has no keywords
        """
        pass
        

if __name__ == "__main__":
    k = GlobalEnvSettings()
    for i_gloVar in GLOBAL_VARIABLES.iteritems():
        print i_gloVar[0] + ":" + i_gloVar[1]

注释:
1.
__file__ is to be the “path” to the file unless the module is built-in (and thus listed in  sys.builtin_module_names) in which case the attribute is not set. If what is being imported is a package then  __path__ is to be set to a list of paths to be searched when looking for modules and packages contained within the package being imported. 


import os
import os.path


print "Setting up folders and paths"
v_currentPath =  os.path.abspath(os.path.dirname(__file__))

print v_currentPath


需要注意的是,如果你直接在Python IDLE中运行该脚本,一定会提示运行失败,原因是:
NameError: name '__file__' is not defined

只有在命令行运行才能获取正确的路径结果。




<think>我们正在讨论Robot Framework测试执行时浏览器显示'data;'的问题。根据用户描述,在执行测试时,浏览器中显示了字符串'data;',这显然不是预期的行为。我们需要分析可能的原因并提供解决方案。 首先,回顾Robot Framework的工作机制:当使用SeleniumLibrary(或Selenium2Library)进行Web测试时,它会通过WebDriver控制浏览器。浏览器显示的内容是由测试步骤决定的,比如打开URL、点击元素等操作。如果浏览器显示'data;',通常意味着浏览器加载了一个内容为'data;'的页面,或者页面渲染出了问题。 可能的原因分析: 1. **URL问题**:测试中可能打开了一个错误的URL,导致服务器返回了'data;'这样的响应。这可能是由于URL拼写错误、服务器配置问题或后端服务返回了错误的数据格式。 2. **数据协议(Data URI)问题**:'data;'看起来像是一个不完整的数据URI(Data URI scheme)。数据URI允许在URL中嵌入小文件,格式为:`data:[<mediatype>][;base64],<data>`。如果测试中使用了不完整的数据URI,浏览器可能会显示'data;'。 3. **页面重定向问题**:在测试过程中,页面可能被重定向到一个数据URI,但该URI格式不正确。 4. **JavaScript错误**:页面的JavaScript可能动态修改了页面内容,而错误导致显示'data;'。 5. **测试脚本问题**:测试脚本中可能直接使用了类似`data;`的字符串作为页面内容,或者通过执行JavaScript将页面内容设置成了'data;'。 解决方案: 1. **检查测试步骤**:首先检查Robot Framework测试脚本中打开页面的步骤。例如,检查`Open Browser`或`Go To`关键字后面的URL是否正确。确保URL是有效的,并且没有拼写错误。 ```robotframework *** Test Cases *** Example Test Open Browser https://example.com Chrome # 确保这里的URL正确 ``` 2. **检查网络请求**:使用浏览器的开发者工具(按F12打开)查看网络请求,确认当浏览器显示'data;'时,实际请求的URL和返回的内容是什么。这有助于判断是服务器返回的问题还是客户端处理的问题。 3. **检查是否使用了数据URI**:在测试脚本中,是否有可能使用了数据URI?例如: ```robotframework Go To data:text/html,<html>Hello</html> # 这样的操作会显示一个包含"Hello"的页面 ``` 如果数据URI格式不正确,比如写成了`data;`,那么浏览器就会显示'data;'。请检查测试脚本中是否有类似的操作。 4. **检查JavaScript执行**:如果测试中使用了`Execute JavaScript`关键字,检查执行的JavaScript代码是否可能修改了页面的内容。例如: ```robotframework Execute JavaScript document.body.innerHTML='data;'; ``` 这样的代码会将整个页面的内容替换为'data;'。 5. **检查服务器响应**:如果URL正确,但服务器返回了错误的内容,那么需要检查服务器端的配置。可能是服务器端程序错误地返回了'data;'。 6. **使用其他浏览器**:尝试更换浏览器(如Firefox、Edge)进行测试,以排除浏览器兼容性问题。 7. **更新库和浏览器驱动**:确保使用的SeleniumLibrary和浏览器驱动(如ChromeDriver)是最新版本,以避免已知的兼容性问题。 8. **查看日志**:Robot Framework执行日志(log.html)中会记录每个步骤的详细信息,包括打开URL的步骤和可能的错误信息。仔细查看日志,可能会找到线索。 9. **简化测试用例**:创建一个最小化的测试用例来重现问题。例如,只包含打开浏览器和访问一个简单页面的操作。如果最小化测试用例没有问题,再逐步添加步骤,直到找到导致问题的操作。 10. **考虑页面加载策略**:有时候页面加载尚未完成,而测试已经开始操作,可能导致页面内容被修改。可以尝试在关键步骤后添加等待,确保页面加载完成。 由于没有提供具体的测试脚本,以上是常见的可能原因和解决方法。用户可以根据这些建议逐步排查。 相关问题: 1. 如何调试Robot Framework中浏览器显示异常内容的问题? 2. 在Robot Framework中,如何正确使用数据URI? 3. 如何捕获并分析SeleniumLibrary执行过程中的网络请求? 4. 如何确保测试脚本中的URL路径正确无误?</think>在 Robot Framework 测试执行过程中,浏览器显示 `data;` 文本是典型的 **数据 URI 解析异常** 现象。以下是根本原因和解决方案: --- ### 原因分析 1. **数据 URI 格式错误** `data;` 是浏览器尝试解析 `data:` URI 协议时的错误提示,通常由以下情况引发: - 测试中使用了不完整的 `data:` URI(如 `data:text/html;` 缺少后续内容)[^1] - 动态生成的 URI 字符串拼接错误(如 `${base_url}data;`) ```robotframework # 错误示例:缺少有效负载数据 Go To data:text/html; ``` 2. **SeleniumLibrary 导航指令异常** - `Go To` 或 `Open Browser` 关键字接收到无效参数时,可能生成错误 URI - 页面重定向逻辑缺陷导致浏览器尝试加载 `data:` 协议 3. **JavaScript 注入问题** 通过 `Execute JavaScript` 执行的代码可能意外修改 `document.location`: ```javascript // 错误示例:未完成的URI赋值 document.location = "data"; ``` 4. **浏览器兼容性问题** 旧版浏览器(如 IE)对 `data:` URI 支持不完善,可能显示原始文本而非渲染内容[^1] --- ### 解决方案 #### 1. 检查导航指令 ```robotframework *** Test Cases *** Valid Navigation Case # 确保URI格式完整 Go To data:text/html;base64,PGh0bWw+SGVsbG8hPC9odG1sPg== # 正确渲染: <html>Hello!</html> ``` #### 2. 修复动态 URI 生成 ```robotframework *** Keywords *** Safe Navigation [Arguments] ${path} # 添加协议检测 ${uri}= Run Keyword If '${path}' startswith 'data' Set Variable ${path} ... ELSE Set Variable https://${path} Go To ${uri} # 防止生成"data;" ``` #### 3. 增强 JavaScript 健壮性 ```robotframework Execute JavaScript if(window.location.protocol==='data:'){console.error('非法协议!')} ``` #### 4. 浏览器兼容性处理 ```robotframework Open Browser about:blank ${BROWSER} # 先打开空白页 Execute JavaScript window.location.href="https://example.com" # JS重定向 ``` --- ### 调试步骤 1. **启用 Selenium 日志** ```robotframework Open Browser about:blank chrome options=add_argument("--log-level=DEBUG") ``` 2. **捕获网络请求** 在浏览器开发者工具(F12)的 **Network** 标签页检查异常请求: | 错误请求示例 | 正确请求示例 | |--------------|--------------| | `data;` | `data:text/html,<h1>Hello</h1>` | 3. **使用页面验证关键字** ```robotframework Page Should Not Contain data; Location Should Not Be data: ``` --- ### 预防措施 - 对所有动态 URL 添加协议验证: ```robotframework ${url}= Set Variable ${input_url} Run Keyword If '${url}' == 'data;' Fail 无效URI格式 ``` - 使用 `URI::Encode` 库处理特殊字符 - 更新浏览器驱动至最新版本(如 ChromeDriver v115+)[^1] > 通过以上方法可解决 99% 的 `data;` 显示问题。若持续出现,需检查后端服务是否返回了非法响应头[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值