2016-08-15 8 views
0

電子メールメッセージの本文部分のメールコードにデータを送信しようとしています。私は文字列を返す関数を呼び出しています。リストを返す別の関数を呼び出しています。私は、メッセージの電子メール本体にこれらを含めることを望みます。私は、エラーTypeError例外を取得しています :Python TypeError:メッセージのメールボディ部分に 'str'と 'list'オブジェクトを連結できません

Traceback (most recent call last): 
    File "E:/test_runners 2 edit project in progress add more tests/selenium_regression_test_5_1_1/Email/email_selenium_report.py", line 32, in <module> 
    report.send_report_summary_from_htmltestrunner_selenium_report2() 
    File "E:\test_runners 2 edit project in progress add more tests\selenium_regression_test_5_1_1\Email\report.py", line 520, in send_report_summary_from_htmltestrunner_selenium_report2 
    extract_testcases_from_report_htmltestrunner()) + "\n Report location = : \\storage-1\Testing\Selenium_Test_Report_Results\ClearCore_5_1_1\Selenium VM\IE11 \n") 
TypeError: cannot concatenate 'str' and 'list' objects 
は、メッセージ本文の一部である私の電子メールのコードの行

msg = MIMEText("\n ClearCore 5_1_1 Automated GUI Test_IE11_Selenium_VM \n " + extract_only_header_from_summary_from_report_htmltestrunner() + "\n extract_header_count__from_summary_from_report_htmltestrunner() \n" + list(
     extract_testcases_from_report_htmltestrunner()) + "\n Report location = : \\storage-1\Testing\Selenium_Test_Report_Results\ClearCore_5_1_1\Selenium VM\IE11 \n") 

私の電子メールのコードは「STR」と「list」のオブジェクト連結することはできません。 :リストを返す

from email.mime.text import MIMEText 
def send_report_summary_from_htmltestrunner_selenium_report2(): 
    print extract_only_header_from_summary_from_report_htmltestrunner() 
    print extract_header_count__from_summary_from_report_htmltestrunner() 
    all_testcases = list(extract_testcases_from_report_htmltestrunner()) 
    # print all_data 
    pprint.pprint(all_testcases) 
    msg = MIMEText("\n ClearCore 5_1_1 Automated GUI Test_IE11_Selenium_VM \n " + extract_only_header_from_summary_from_report_htmltestrunner() + "\n extract_header_count__from_summary_from_report_htmltestrunner() \n" + list(
      extract_testcases_from_report_htmltestrunner()) + "\n Report location = : \\storage-1\Testing\Selenium_Test_Report_Results\ClearCore_5_1_1\Selenium VM\IE11 \n") 

    msg['Subject'] = "ClearCore 5_1_1 Automated GUI Test" 
    msg['to'] = "[email protected]" 
    msg['From'] = "[email protected]" 

    s = smtplib.SMTP() 
    s.connect(host=SMTP_SERVER) 
    s.sendmail(msg['From'], msg['To'], msg.as_string()) 
    s.close() 

関数である:

def extract_testcases_from_report_htmltestrunner(): 
    filename = (r"E:\test_runners 2 edit project\selenium_regression_test_5_1_1\TestReport\ClearCore501_Automated_GUI_TestReport.html") 
    html_report_part = open(filename,'r') 
    soup = BeautifulSoup(html_report_part, "html.parser") 
    for div in soup.select("#result_table tr div.testcase"): 
      yield div.text.strip().encode('utf-8'), div.find_next("a").text.strip().encode('utf-8') 

私は、文字列を返す呼び出しています他の2つの機能があります:私は、電子メールメッセージのボディ部に、これらの関数からのデータを含めることができますどのように

def extract_only_header_from_summary_from_report_htmltestrunner(): 
    filename = (r"E:\test_runners 2 edit project\selenium_regression_test_5_1_1\TestReport\ClearCore501_Automated_GUI_TestReport.html") 
    html_report_part = open(filename,'r') 
    soup = BeautifulSoup(html_report_part, "html.parser") 
    table = soup.select_one("#result_table") 

    #Create list here... 
    results = [] 

    headers = [td.text for td in table.select_one("#header_row").find_all("td")[1:-1]] 
# print(" ".join(headers)) 

    #Don't forget to append header (if you want) 
    results.append(headers) 
    return results 


def extract_header_count__from_summary_from_report_htmltestrunner(): 
    filename = (r"E:\test_runners 2 edit project\selenium_regression_test_5_1_1\TestReport\ClearCore501_Automated_GUI_TestReport.html") 
    html_report_part = open(filename,'r') 
    soup = BeautifulSoup(html_report_part, "html.parser") 
    table = soup.select_one("#result_table") 

    #Create list here... 
    results = [] 
    for row in table.select("tr.passClass"): 
     #Store row string in variable and append before printing 
     row_str = " ".join([td.text for td in row.find_all("td")[1:-1]]) 
     results.append(row_str) 
#  print(row_str) 

    return results 

? 私はそれを連結しようとしましたが、文字列とリストを連結することができないと言われています。

おかげで、リアズ

答えて

1
msg = MIMEText("\n ClearCore 5_1_1 Automated GUI Test_IE11_Selenium_VM \n " + extract_only_header_from_summary_from_report_htmltestrunner() + "\n extract_header_count__from_summary_from_report_htmltestrunner() \n" + list(
     extract_testcases_from_report_htmltestrunner()) + "\n Report location = : \\storage-1\Testing\Selenium_Test_Report_Results\ClearCore_5_1_1\Selenium VM\IE11 \n") 

あなたが明示的に不可能であり、リストや文字列をCONCATしようとしています。

編集関数のすべては、文字列の代わりにリストを返します。

あなたの期待される結果は、リスト内のすべての要素間の'\n'を文字列にリストを有効にする'\n'.joinを使用することができ、文字列の場合:

msg = MIMEText("\n ClearCore 5_1_1 Automated GUI Test_IE11_Selenium_VM \n " + 
       '\n'.join(extract_only_header_from_summary_from_report_htmltestrunner()) + 
       '\n'.join(extract_header_count__from_summary_from_report_htmltestrunner()) + 
       '\n'.join(extract_testcases_from_report_htmltestrunner()) + 
       "\n Report location = : \\storage-1\Testing\Selenium_Test_Report_Results\ClearCore_5_1_1\Selenium VM\IE11 \n") 

フォーマットするとき、私はいくつか'\n'を失っているかもしれない、あなたが追加する必要がありますあなたがそれらを必要とすればそれらを戻します。

あなたは文字列に関数の戻り値を変更する代わりにMIMETextへのコールの内側に変換する場合、それはまた、あなたが持っている問題の実例について

def extract_only_header_from_summary_from_report_htmltestrunner(): 
    filename = (r"E:\test_runners 2 edit project\selenium_regression_test_5_1_1\TestReport\ClearCore501_Automated_GUI_TestReport.html") 
    html_report_part = open(filename,'r') 
    soup = BeautifulSoup(html_report_part, "html.parser") 
    table = soup.select_one("#result_table") 

    results = [] 

    headers = [td.text for td in table.select_one("#header_row").find_all("td")[1:-1]] 

    results.append(headers) 

    # Use whatever character you want as a "separator" instead of '\n' 
    return '\n'.join(results) 
+0

私はあなたの関数extract_only_header_from_summary_report_htmltestrunnerを試しました。エラーが発生しましたTypeError:シーケンスアイテム0:期待される文字列、リストが見つかりました –

+0

エラーで強調表示されている行は、返り値 '\ n'にあります。結合(結果) –

+0

@RiazLadhani Oh。私は、結果がリストのリストであるという事実を忘れていましたが、それは必要ではないようです。 'results'変数を削除し、次に' return '\ n'.join(headers) 'を削除することができます。 – DeepSpace

-2

、少し読みやすくなります。

In [2]: lst_of_str = ['abc', 'def'] 

In [3]: s = 'g' 

In [4]: s + lst_of_str 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-45caf5564ff0> in <module>() 
----> 1 s + lst_of_str 

TypeError: cannot concatenate 'str' and 'list' objects 

In [5]: s + ''.join(lst_of_str) 
Out[5]: 'gabcdef' 

要は、リストを明示的に文字列に変換する必要があります。リストにstrを呼び出すことによって、あなたは結果を望んでいないことに注意してください:

In [6]: s + str(lst_of_str) 
Out[6]: "g['abc', 'def']" 

EDIT

また、あなたはそれが(str, str)のタプルを返します

yield div.text.strip().encode('utf-8'), div.find_next("a").text.strip().encode('utf-8') 

持っているあなたの関数に注意してくださいstrの代わりに。両方をメール本文に含める場合は、「平らにする」必要があります。たとえば、

import itertools 
s + '\n'.join(itertools.chain(extract_testcases_from_report_htmltestrunner())) 
+0

私はOPが '' ['abc'、 'def'] "'を出力として望んでいないと思っています。 ''、' .join(['abc'、 'def'])' '' abc、def''のために 'join 'を使うのが良いでしょう。 – DeepSpace

+0

@DeepSpace 'str(list)'によって、私は彼がそうしたくないと指摘していました。 – ShuaiYuan

関連する問題