通过Python文件向Robot Framework传递命令行参数

3

语言: Python - 3.7.3 机器人框架 - 3.1.1 熟练程度: 初学者

我想通过命令提示符将参数传递给Python文件变量,然后通过将Python文件作为变量添加到Robot文件中来打印相同的内容。

cmd (Variables) --> python file --> robot (print those variables) 

但显然,所有的尝试都没有产生预期的结果。非常感谢任何指导。

注意: 机器人和Python文件都在PyCharm IDE的同一个目录下。

命令行:

1st try: robot -d Report -V test.py Test_sample.robot|py test.py test@test.com test@123 QA1

2nd try: robot -d Report Test_sample.robot|py test.py test@test.com test@123 QA1

3rd try: robot -d Report --Variablefile py test.py Test_sample.robot|py test.py test@test.com test@123 QA1

4th try: robot -d Report -V | py test.py test@test.com test@123 QA1| Test_sample.robot

Python:-

import sys

username = str(sys.argv[1])
password = str(sys.argv[2])
environment = str(sys.argv[3])

机器人:-

*** Settings ***
Library     SeleniumLibrary
Library     Collections
Variables  test.py

*** Test Cases ***
Pass variables from Python File

        log to console  The usr is: "${username}"
        log to console  The pwd is: "${password}"
        log to console  The env is: "${environment}"

预期结果:

用户是:test@test.com 密码是:test@123 环境是:QA1

实际结果:

[ ERROR ] Unexpected error: OSError: [Errno 22] Invalid argument
Traceback (most recent call last):
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\utils\application.py", line 83, in _execute
    rc = self.main(arguments, **options)
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\run.py", line 439, in main
    result = suite.run(settings)
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\running\model.py", line 222, in run
    self.visit(runner)
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\model\testsuite.py", line 168, in visit
    visitor.visit_suite(self)
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\model\visitor.py", line 84, in visit_suite
    if self.start_suite(suite) is not False:
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\running\runner.py", line 83, in start_suite
    test_count=suite.test_count))
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\output\output.py", line 51, in start_suite
    LOGGER.start_suite(suite)
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\output\logger.py", line 200, in start_suite
    logger.start_suite(suite)
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\output\console\verbose.py", line 35, in start_suite
    self._writer.suite_separator()
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\output\console\verbose.py", line 104, in suite_separator
    self._fill('=')
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\output\console\verbose.py", line 110, in _fill
    self._stdout.write('%s\n' % (char * self._width))
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\output\console\highlighting.py", line 53, in write
    self.flush()
  File "<<Dir path>>\python\python37-32\lib\site-packages\robot\output\console\highlighting.py", line 66, in flush
    self.stream.flush()
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp1252'>
OSError: [Errno 22] Invalid argument

你知道机器人有一个通过命令行设置变量的机制,使用--variable选项吗?你不需要从sys.argv中获取信息。 - Bryan Oakley
@BryanOakley: 是的,我尝试过 -v(变量)和 -V(变量文件)。如果我只运行 Python 文件,我可以打印出变量,但是当我尝试在机器人文件中同时打印相同的内容时,问题就开始了,正如我上面所描述的那样。 - Learner
你试图解决的问题不太清楚。你可以使用--variable从命令行设置变量。你是在问如何从Python库中打印机器人值的值吗?还是你正在尝试找出既适用于机器人又适用于非机器人的东西? - Bryan Oakley
@BryanOakley:如果我的描述不够清晰,我很抱歉。我的目标是从命令行传递凭据,这样其他同事就可以使用自己的凭据运行我的自动化脚本。因此,为了进行操作,我决定最初从命令行获取凭据,将其存储在Python中,并将其传递给机器人文件进行进一步操作。现在,看起来Python在执行完成后会清除变量。CMD LINE>>robot -d Report test_sample.robot && py Methods.py Prasad Rajassekaran 33 ;;; 结果:查询语句为:select * from table where username=-d and password=Report - Learner
2个回答

5
在您的评论中写道:

我的目标是通过命令行传递凭据。

Robot框架支持使用--variable(和-v)命令行选项实现此功能。使用此选项将覆盖任何导入的变量或在机器人文件中定义的变量。
例如,您可以在测试本身中设置凭据的默认值:
*** Variables ***
${USER}         test@test.com
${PASSWORD}     test@123
${ENVIRONMENT}  QA1

*** Test cases ***
Example
    log to console  \n*****
    log to console  username: ${USER}
    log to console  password: ${PASSWORD}
    log to console  environment: ${ENVIRONMENT}

您可以使用命令行中的-v--variable修改这些值:
$ robot -v USER:bob -v PASSWORD:bob@123  -v ENVIRONMENT:QA2 ...

如果你需要在Python函数中访问这些变量而不必传入它们,你可以使用内置关键字get_variable_value来获取其值:

from robot.libraries.BuiltIn import BuiltIn
...
user = BuiltIn().get_variable_value('${USER}')

1
我不太确定这个,我猜我们也应该将脚本的名称传递给sys.argv。
在下面的示例中,sys.argv [0]是传递的脚本名称参数。
import sys
print "This is the name of the script: ", sys.argv[0]
print "Number of arguments: ", len(sys.argv)
print "The arguments are: " , str(sys.argv)

参考文献:https://www.pythonforbeginners.com/system/python-sys-argv


显然是相同的结果。 - Learner
这个线程应该会对你有所帮助 https://dev59.com/hXNA5IYBdhLWcg3wVcFx - Suresh Parimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接