Есть ли способ получить текущий экземпляр imaplibrary из фреймворка робота и перейти к отдельной функции python? - PullRequest
0 голосов
/ 23 ноября 2018

Я застрял в тестовом наборе, где мне нужно проверить, что после выполнения действия электронная почта срабатывает, если да, то к электронной почте есть вложение.

для первого действия, которое я использую ПодождитеДля электронной почты ключевое слово библиотеки imablibrary robotframework.Теперь для части вложения, поскольку для этой цели нет ключевого слова, я написал отдельную функцию python, которой я передаю email_index в качестве параметра, записанного с помощью Wait For Email .после этого он должен пройтись по электронной почте и получить вложение.

**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' нет атрибута 'get_content_maintype'

я знаю, что в библиотеке Builtin есть ключевое слово get_library_instance ()уже использует приведенный ниже код для получения экземпляра драйвера selenium2libray.

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

Есть ли подобный способ решения этой проблемы для imaplibrary?если нет, пожалуйста, предложите способ для этого.

1 Ответ

0 голосов
/ 26 ноября 2018

Я не смог использовать экземпляр imaplibrary для этой цели, но нашел другой способ для достижения этой цели.Основная цель этого вопроса - увидеть, как обрабатывать связанные с вложениями gmail случаи в среде роботов (например, проверять / читать / загружать вложения).ниже код для этого.ниже приведена небольшая пользовательская функция для достижения того же.

**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
...