有没有办法从机器人框架获取当前的 imaplibrary 实例并传递给单独的 python 函数?

Is there a way to get current imaplibrary instance from robot framework and pass to a separate python function?

我被困在一个测试用例中,我需要检查执行操作后是否触发了电子邮件,如果是,则电子邮件有附件。

对于第一个操作,我正在使用 Wait For Email robotframework 的 imaplibrary 库的关键字。现在对于附件部分,因为没有用于此目的的关键字,我编写了一个单独的 python 函数,我将 email_index 作为参数传递给 等待电子邮件 关键字。之后它应该遍历电子邮件并获取附件。

**robot file:**

${new_email}=    Wait For Email    sender=${sender_email}   text=${expected_content}   recipient=${recepient}   timeout=70
${file}   get_attachments   ${new_email}


**python function**

import imaplib
import email

# m is the email index passed from wait for email keyword
def get_attachments(m):
    if m.get_content_maintype() == 'multipart': #multipart messages only #getting below mentioned error in this line
        for part in m.walk():

        #find the attachment part
            print part.get_content_maintype()
            if part.get_content_maintype() == 'multipart': continue
            if part.get('Content-Disposition') is None: continue

        #save the attachment in the program directory
            filename = part.get_filename()
            return filename

现在的问题是我无法将机器人框架创建的 imaplibrary 会话共享或传递给自定义 python 函数。所以我低于错误。

AttributeError: 'str' object has no attribute 'get_content_maintype'

我知道内置库中有一个关键字 get_library_instance() 并且我已经在使用下面的代码来获取 selenium2libray 驱动程序实例。

def get_webdriver_instance():
        se2lib = BuiltIn().get_library_instance('Selenium2Library')
        return se2lib._current_browser()

有没有类似的方法可以解决 imaplibrary 的这个问题?如果没有,请提出解决方法。

我无法为此目的使用 imaplibrary 的实例,但找到了另一种实现此目的的方法。这个问题的主要目的是了解如何在机器人框架中处理与 gmail 附件相关的案例(如 check/read/downloading 附件)。下面是它的代码。为此,下面是一个用于实现相同目的的小自定义函数。

**robot file:**
Check Mail
    ${new_email}=    Wait For Email    sender=${sender_email}   text=${expected_content}   recipient=${recepient}   timeout=70
    ${file}          get_attachments   ${new_email}
    log many         ${file}   


**python function**

#index is the email index passed from wait for email keyword
def get_attachments(index):
    files=[]
    mail = imaplib.IMAP4_SSL('imap.gmail.com')
    mail.login('email', 'password')
    mail.select('inbox')

    result, data = mail.uid('fetch',index, '(RFC822)')
    m = email.message_from_string(data[0][1])
    if m.get_content_maintype() == 'multipart': 
        for part in m.walk():
            #logger.console(part)

        #find the attachment part
            if part.get_content_maintype() == 'multipart': continue
            if part.get('Content-Disposition') is None: continue

        #save the attachment in the program directory
            filename = part.get_filename()
            files.append(filename)
            fp = open(filename, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()
        return files