【问题标题】:Inner nested class access from robot framework来自机器人框架的内部嵌套类访问
【发布时间】:2019-12-30 18:41:10
【问题描述】:

机器人 - 3.1.1 Python - 3.7.3

我想从机器人框架访问嵌套内部类中编写的方法。

机器人:

*** Settings ***
Library             ../***/***/***/OrderList.py

    *** Keywords ***

    Click from order
        click_order

Python:

class OrderList():
           pass
class Ordertable(OrderList):
       def click_order(self):
            foo

运行上述机器人套件时出现以下错误。

No keyword with name 'click_order' found.

如果我像下面这样移动父类(OrderList)下的click_order方法,那么机器人可以识别。

class OrderList():
    def click_order(self):
            foo
class Ordertable(OrderList):
       pass

有人可以帮助我了解机器人套件需要进行哪些更改才能调用嵌套的内部类方法吗?

【问题讨论】:

  • 使用此选项--pythonpath ../***/***/***/OrderList.py 启动您的测试并将您的库导入为OrderList.Ordertable
  • @BenceKaulics 我已经在 pythonpath 中添加了完整的 python pah,包括文件名,并按照您的建议导入,但显然问题仍然存在。导入错误也出现'failed: ModuleNotFoundError: No module named '.' '

标签: python robotframework


【解决方案1】:

当 Robot Framework 导入一个库时,它会尝试仅导入与 .py 文件同名的类 - 如您的情况,OrderList.py 文件中的类 OrderList。而且它不会导入任何其他类 - check the documentation for more details

最简单的选择是将要使用的类重命名为与文件相同的名称。

如果这不适用 - 并且看起来您的意图是使用多个类,您可以将文件放在 PYTHONPATH 中(例如,将文件物理移动到其中的目录,或扩展它以包含模块的一个) 并将类分别导入为OrderList.Ordertable
另一种方法是在 python 端解决它 - 将每个类放在自己的模块中,每个类都导入带有基类的模块。

第一个是运营噩梦,第二个是设计和维护;你的选择 :)。

【讨论】:

  • 我仍然遇到同样的错误。我尝试指定嵌套类,如 'Library ../***/***/***/OrderList.Ordertable' 和 OrderList.Ordertable.click_order(关键字调用)
  • 您不能使用'Library ../***/***/***/OrderList.Ordertable 导入库 - 当您在文件系统的某处导入python 模块时,它必须以".py" 结尾。或者 - .py 文件本身必须位于 PYTHONPATH 中的目录中 - 然后此导入将起作用(并且没有“../../”相对路径)。查看另一个答案,如何将目录附加到 PYTHONPATH 临时 - 运行 - 在调用 robot 脚本时使用参数 --pythonpath
【解决方案2】:

这是一个关于如何将类作为库而不是整个 python 文件导入的示例:

  1. 在名为tests 的文件夹中有一个test.robot 和一个OrderList.py 文件。
  2. OrderList.py:

    class OrderList():
               pass
    
    class Ordertable(OrderList):
           def click_order(self):
                print('foo')
    
  3. 测试机器人:

    *** Settings ***
    Library        OrderList.Ordertable
    
    *** Test Cases ***
    AA
        click order
    
  4. tests 文件夹的父文件夹使用以下命令启动它:robot --pythonpath .\tests\ --test AA .\tests\test.robot

  5. 结果:

    PS prompt> robot --pythonpath .\tests\ --test AA .\tests\test.robot
    ==============================================================================
    Test
    ==============================================================================
    AA                                                                    | PASS |
    ------------------------------------------------------------------------------
    Test                                                                  | PASS |
    1 critical test, 1 passed, 0 failed
    1 test total, 1 passed, 0 failed
    ==============================================================================
    Output:  C:\Users\myuser\output.xml
    Log:     C:\Users\myuser\log.html
    Report:  C:\Users\myuser\report.html
    

【讨论】:

  • 如果 python 和机器人位于同一目录下,这工作正常,但如果 python 文件来自不同目录,则 baseclass.childclass 不被接受。示例:库 ../Library/OrderList.Ordertable
  • 如果--pythonpath 传递的路径是绝对路径,那么无论工作目录如何,它都应该可以工作。
  • 因为我直接从 python 运行机器人套件,所以不支持“--pythonpath”。我的执行方式是 import robot robot.run("C:\\foo\\test_sample.robot", log=log, report=report, output=output, loglevel="DEBUG", stdout=exec_report)
  • 可以直接从python设置pythonpath:stackoverflow.com/questions/3108285/…
猜你喜欢
  • 2016-04-07
  • 2022-01-16
  • 2014-02-11
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多