【问题标题】:Call Python from Robot Framework从机器人框架调用 Python
【发布时间】:2017-11-02 19:46:12
【问题描述】:

我是机器人框架的新手 - 我曾尝试将此代码调用到机器人框架,但无济于事。我只需要一些帮助才能在机器人框架中运行我的 python 脚本并在该应用程序中返回 PASS 和 FAIL。对此的任何帮助将不胜感激。

# -*- coding: utf-8 -*-
import paramiko
import time,sys
from datetime import datetime
from time import sleep

prompt = "#"

datetime = datetime.now()

ssh_pre = paramiko.SSHClient()
ssh_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_pre.connect("192.168.0.1",22, "admin", "admin")
output=""
ssh = ssh_pre.invoke_shell()
sys.stdout=open("ssh_session_dump.txt","w")

print("Script Start Date and Time: ", '%s/%s/%s' % (datetime.month, datetime.day, datetime.year), '%s:%s:%s' % (datetime.hour, datetime.minute, datetime.second))

model="XV4-17034"

ssh.send("more off\n")
if ssh.recv_ready():
    output = ssh.recv(1000)
ssh.send("show system-info\n")
sleep(5)
output = ssh.recv(5000)

output=output.decode('utf-8')
lines=output.split("\n")

for item in lines:
    if "Model:" in item:
        line=item.split()
        if line[1]==model+',':
            print("Test Case 1.1 - PASS - Model is an " + model)
        else:
            print("Test Case 1.1 - FAIL - Model is not an " + model)

ssh.send( "quit\n" )
ssh.close()

datetime = datetime.now()

print("")
print("Script End Date and Time: ", '%s/%s/%s' % (datetime.month, datetime.day, datetime.year), '%s:%s:%s' % (datetime.hour, datetime.minute, datetime.second))
print("")
sys.stdout.close()

【问题讨论】:

  • 寻找那些机器人框架专家:-)
  • 您是要编写一个直接调用此代码的测试(即:执行 python the_script.py),还是要将此代码转换为关键字,以便编写一个使用关键字?
  • @BryanOakley - 直接调用我的脚本的测试就足够了。谢谢。我在网上查看了示例,但无法很好地了解它是如何正确完成的。

标签: python python-2.7 python-3.x robotframework


【解决方案1】:

如果这是我的项目,我会将代码转换为函数,然后创建包含该函数的关键字库。

例如,您可以创建一个名为 CustomLibrary.py 的文件,其函数定义如下:

def verify_model(model):
    prompt = "#"
    datetime = datetime.now()
    ssh_pre = paramiko.SSHClient()
    ...
    for item in lines:
        if "Model:" in item:
            line=item.split()
            if line[1]==model+',':
                return True
            else:
                raise Exception("Model was %s, expected %s" % (line[1], model))
    ...

然后,您可以像这样创建机器人测试:

*** Settings ***
Library  CustomLibrary

*** Test cases ***
Verify model is Foo
    verify model    foo

当然,比这要复杂一点。例如,您可能需要更改函数中的逻辑以确保在返回之前关闭连接。但总的来说,这是通用的方法:创建一个或多个函数,将它们作为库导入,然后从机器人测试中调用这些函数。

【讨论】:

  • 我好像明白你的方向了。让我看看我能不能让它工作。非常感谢。
  • 是的...我不明白。我只需要上面代码的示例。如果有人可以提供帮助。
  • @pythonian:你没有得到什么?您不了解如何将代码转换为函数?还是你不明白如何将函数导入机器人测试?
  • 我不明白如何将函数导入机器人测试。我真正需要的是一个 Python 脚本和一个等效的 Robot FrameWork 测试。我需要的只是一个工作样本。它实际上不需要与上面提供的代码有任何关系。
  • @pythonian:正确。机器人有关于如何做到这一点的非常好的文档。 robotframework.org/robotframework/latest/… 关于它的唯一特别之处是命名约定,即类与文件同名减去 .py 后缀。
【解决方案2】:

要从 Robot Framework 调用 Python 代码,您需要使用与 Robot Framework Library 相同的语法,但是一旦这样做,就非常简单。这是一个示例,位于与测试相同的文件夹中名为 CustomLibrary.py 的文件中:

from robot.libraries.BuiltIn import BuiltIn
# Do any other imports you want here.

class CustomLibrary(object):
    def __init__(self):
        self.selenium_lib = BuiltIn().get_library_instance('ExtendedSelenium2Library')
        # This is where you initialize any other global variables you might want to use in the code.
        # I import BuiltIn and Extended Selenium2 Library to gain access to their keywords.

    def run_my_code(self):
        # Place the rest of your code here

我在测试中经常使用它。为了调用它,你需要类似这样的东西:

*** Settings ***
Library     ExtendedSelenium2Library
Library     CustomLibrary

*** Test Cases ***
Test My Code
    Run My Code

这将运行您在 Python 文件中放置的任何代码。据我所知,Robot Framework 并没有直接实现 Python,但它是用 Python 编写的。因此,只要您以 Python 可以识别的形式输入它,它就会像 BuiltIn 或 Selenium2Library 中的任何其他关键字一样运行它。

请注意,ExtendedSelenium2Library 与 Selenium2Library 完全相同,只是它包含处理 Angular 网站的代码。相同的关键字,所以我只是将其用作严格的升级。如果您想使用旧的 Selenium2Library,只需将文本“ExtendedSelenium2Library”的所有实例替换为“Selenium2Library”即可。

请注意,要使用 BuiltIn 或 ExtendedSelenium2Library 中的任何关键字,您需要分别使用语法 BuiltIn().the_keyword_name(arg1, arg2, *args)selenium_lib().the_keyword_name(arg1, arg2, *args)

【讨论】:

    【解决方案3】:

    最简单的方法是使用相对路径方法将.py 文件导入您的测试套件,例如./my_lib.py(假设您的python 文件与您的TC 文件在同一个文件夹中)

    在你的.py文件中,简单定义一个函数,例如:

    def get_date(date_string, date_format='%Y-%m-%d'):
        return datetime.strptime(date_string, date_format)
    

    然后在您的 TC 文件中:

    *** Settings ***
    Library     ./my_lib.py
    
    *** Test Cases ***
    TEST CASE 1
        Get Date    |     ${some_variable}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2016-01-03
      • 1970-01-01
      • 2021-11-11
      • 2013-03-09
      相关资源
      最近更新 更多