見出し画像

退屈なことをPythonにやってもらうための演習の回答[11.10.1]

毎度、『退屈なことはPythonにやらせよう』についている演習プロジェクトの自分なりの回答を投げています。

結局、使ったことがないAOL.comのメアドを取得して使いました。

色々と詰まりましたし、これで正しい実装なのか?という疑問は消えません… 「とりあえず動いた」レベルです。

ページ遷移を待つためのソースコードは、検索して引っ張ってきました。読み込み待ちのコードだったのですが、これをページ遷移を待つために使ってよいのでしょうか… とりあえずlogging.debugはすごくうるさくなります。

次に引っかかったのがsubmit()が使えなかったパスワード入力画面でした。どうもHTMLのformではなくJavaScriptで実装されていて、しかもbuttonではなくそれをラップしてるdivでクリック判定していたようで…(あまりちゃんとソースを見ていなかったからですが)モダンな実装はややこしくなりますね。

メールの送信確認もできたらよかったのですが… AOL側の送信失敗画面を出すことは(面倒なので)やりたくないので、とりあえず適当なtry-except文を入れました。

#! python3
# 11.10.1 コマンドライン電子メーラー

# コマンドラインから電子メールアドレスと本文テキストを受け取り
# SeleniumをつかってWebメールにログインし
# 指定したアドレスに本文テキストの電子メールを送信するプログラムを書きなさい

# 第1引数がメアド、第2引数が本文
# とにかく改行とか知らない

import os, sys, logging, time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

#DEBUGCRITICAL
logging.basicConfig(level=logging.DEBUG,
    format=' %(asctime)s - %(levelname)s - %(message)s')
logging.debug('start')

# 送信元emailとパスワード
# ベタ書きはそもそも危険
from_email = '****'
from_pwd = '****'

# 第1引数を代入(エラーは強制終了)
try:
    to_email = sys.argv[1]
except IndexError:
    print('Please input your e-mail address.')
    sys.exit(1)

# 第2引数を代入(エラーは強制終了)
try:
    text = sys.argv[2]
except IndexError:
    print('Please input your e-mail text.')
    sys.exit(1)

# AOLにアクセス
# ※リダイレクトされる
browser = webdriver.Firefox()
browser.get('https://mail.aol.com/')

# IDを入力して送信
email_elem = browser.find_element_by_id('login-username')
email_elem.send_keys(from_email)
email_elem.submit()
logging.debug('email submited.')

# パスワード送信ボタンが出るまで待機
WebDriverWait(browser, 10).until(
    expected_conditions.presence_of_element_located((By.TAG_NAME, 'button'))
)

# パスワードを入力
pwd_elem = browser.find_element_by_id('login-passwd')
pwd_elem.send_keys(from_pwd)

# パスワードを送信
pwd_click_elem = browser.find_element_by_class_name('signin-cont')
pwd_click_elem.click()

logging.debug('password submited.')

# メール作成画面への遷移ボタンが表示されるまで待機
WebDriverWait(browser, 10).until(
    expected_conditions.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div[3]/div[1]/div[1]/div[1]/div[1]/div'))
)

# メール作成画面へ遷移
compose_elem = browser.find_element_by_xpath('/html/body/div[1]/div/div[3]/div[1]/div[1]/div[1]/div[1]/div')
compose_elem.click()

# メールの送信先が表示されるまで待機
WebDriverWait(browser, 10).until(
    expected_conditions.presence_of_element_located((By.ID, 'toInputField'))
)

# メールの送信先を入力
to_email_area = browser.find_element_by_id('toInputField')
to_email_area.send_keys(to_email)

# 本文を入力
content_area = browser.find_element_by_name('composeMessage_body_body')
content_area.send_keys(text)

# メールを送信
submit_button = browser.find_element_by_id('uniqName_4_3')
submit_button.click()

# 送信完了画面が出たら「good」としてクローズ。
# かと言って、ミスってても何もしない。
# ここの処理は間違ってる可能性が高い。
try:
    WebDriverWait(browser, 10).until(
        expected_conditions.presence_of_element_located((By.CLASS_NAME, 'confirmMessage'))
    )
    logging.debug('good')
except:
    logging.debug('no good')
finally:
    browser.close()

次の2048のやつ、上下左右キーを乱打するだけでいいんでしょうか…笑

この記事が気に入ったらサポートをしてみませんか?