參考 : 初識selenium-發送QQ郵件 鏈接------》https://blog.csdn.net/qiye005/article/details/80259607
前言:
為實現selenium+python自動發送QQ郵件功能,需要搭建的環境:安裝selenium包(pip install selenium)及安裝谷歌驅動器(http://chromedriver.storage.googleapis.com/index.html)。並且要了解要selenium進行元素定位的八大方法,詳細的資料請自行網上搜索或者查看書籍。
具體需要什么知識基礎請參考:
https://blog.csdn.net/huilan_same/article/details/52559711
---------------------
實現:
首先定義郵件發送的步驟:
第一步:打開瀏覽器,調到郵箱登錄頁面,輸入賬號密碼並登錄;
第二部:點擊進入郵件編輯頁面,輸入地址、標題和內容,並發送;
第三部:關閉瀏覽器;
代碼:
根據之前的動作分解,結合掌握的selenium進行元素定位的方法,實現下述python代碼。
"""
此腳本主要參考:https://blog.csdn.net/vae0000/article/details/73162662
https://blog.csdn.net/vae0000/article/details/73179680
https://blog.csdn.net/qq_19655383/article/details/70141624
https://blog.csdn.net/qiye005/article/details/80259607
主要修改了輸入的參數對代碼進行了優化及對這些操作進行詳細的相關說明,方便新手學習
最后修改日期:2018-11-16
V1.0 實現腳本化命令行方式自動發送郵件
V1.1封裝登陸,寫信,發送與退出子函數,並嘗試調用
V1.2對代碼進行優化及進行詳細的說明
最后修改作者:sobbing_child
"""
from selenium import webdriver
#導入By類
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import time
# dr = webdriver.Chrome() #webdirver模塊初始化Chrome對象
# dr.get("https://mail.qq.com")
# 函數名稱: LoginFun(_username,_password)
# 函數功能: 實現根據指定QQ郵箱網頁,賬號,密碼實現登陸QQ郵箱動作
# _dr:webdirver模塊初始化Chrome對象
# _emailAddress:訪問QQ郵箱網址
# _username:郵箱用戶名
# _password:相應郵箱用戶名密碼
# 輸出參數: 使用ID進行定位元素並直接進行send_keys操作並把切換表單去掉,函數clear()去掉
# 修改信息: 2018-11-16 sobbing_child
#封裝進行登錄的函數
def LoginFun(_dr,_emailAddress,_username,_password):
# 登錄網址
_dr.get(_emailAddress)
# 根據ID切換表單
_dr.switch_to_frame("login_frame")
# 找到賬好的ID,並進行輸入
_dr.find_element(By.NAME,"u").send_keys(_username)
# 找到密碼的ID,並進行輸入
_dr.find_element(By.NAME,"p").send_keys(_password)
# 找到登錄的ID並進行點擊操作,隱式等待5秒
Login = _dr.find_element(By.ID,"login_button")
Login.click()
_dr.implicitly_wait(5)
# 函數名稱 WriteAndSendFun(_driver,_receiverAddress,_subjectString,_contentString)
# 函數功能: 實現根據指定收件人定制,主題,新建郵件正文內容,實現填寫及發送動作
#
# 輸入參數: _dirver模塊初始化Chrome對象
# _receiverAddress:收件人郵箱
# _subjectString:主題名稱
# _contentString:郵件正文內容
# 輸出參數: 對某些操作進行詳細的說明及使用其它方式進行定位(ps:坑多,收件人定了一晚上沒定到)
# 修改信息: 2018-11-16 sobbing_child
def WriteAndSendFun(_dr,_receiverAddress, _subjectString, _contentString):
#可以根據ID或者link_text方法進行定位元素
# writeLink = dr.find_element_by_link_text("寫信")
writeLink = _dr.find_element(By.ID,"composebtn")
writeLink.click()
# 根據標簽iframe的ID切換到寫信框架
_dr.switch_to_frame("mainFrame")
#收件人信息 根據xpath方法定位,可以用其它方法但是這里用xpath方法進行定位准確
_dr.find_element_by_xpath("//*[@id='toAreaCtrl']/div/input").send_keys(_receiverAddress)
#郵件主題信息 根據ID進行定位
_dr.find_element(By.ID,"subject").send_keys(_subjectString)
#郵件正文信息 可以根據tag或者class_name進行表單的切換操作
#dr.switch_to_frame(dr.find_element_by_tag_name("iframe"))
_dr.switch_to_frame(_dr.find_element_by_class_name("qmEditorIfrmEditArea"))
_dr.find_element_by_tag_name("body").send_keys(_contentString)
#送信按鈕觸發
_dr.switch_to.parent_frame()
#webDriver只能在一個頁面上對元素識別和定位,對於frame/iframe表單內嵌頁面上的元素無法直接定位,
#此時就需要通過switch_to.frame()方法將當前定位的主題切換為iframe表單的內嵌頁面中。
_dr.find_element_by_link_text("發送").click()
_dr.implicitly_wait(5)
# 定義主函數
def main():
#驅動存放位置
webDriverLoc = r'C:\Users\Administrator\AppData\Local\Programs\Python\Python36\chromedriver.exe'
dr = webdriver.Chrome(executable_path=webDriverLoc)
#QQ郵箱網址,賬號密碼相關
username = '登陸郵箱賬號'
password = '登陸郵箱密碼'
emailAddress="https://mail.qq.com/"
# 郵件內容定義
receiverAddress = "QQ郵箱"
subjectString = "selenup+python自動化測試"
contentString = "這是郵件正文,測試,測試"
# 調用登陸操作子函數
LoginFun(dr,emailAddress,username,password)
# 調用寫信與發送操作子函數
WriteAndSendFun(dr,receiverAddress, subjectString, contentString)
# 最后調用退出操作子函數
dr.close()
# 調用主函數
if __name__ == "__main__":
main()
# ---------------------
# 作者:sobbing_child
# 來源:QiYe005
# 原文:https://blog.csdn.net/qiye005/article/details/80259607
# 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
接下來進行詳細的說明,先看如下代碼及圖片
根據元素的name進行定位(賬號和密碼):
切換表單:
根據元素的ID進行定位(登錄):
# 登錄網址
_dr.get(_emailAddress)
# 根據ID切換表單
_dr.switch_to_frame("login_frame")
# 找到賬好的ID,並進行輸入
_dr.find_element(By.NAME,"u").send_keys(_username)
# 找到密碼的ID,並進行輸入
_dr.find_element(By.NAME,"p").send_keys(_password)
# 找到登錄的ID並進行點擊操作,隱式等待5秒
Login = _dr.find_element(By.ID,"login_button")
Login.click()
_dr.implicitly_wait(5)
從圖中可以看出各界面對應的ID及NAME的值,這里用的是根據NAME的值,注意要先切換到表單再進行操作,也可以使用其它方法進行定位這樣定位較為清晰明了
再來看下面的代碼,進入寫信的階段:
根據元素的ID進行定位(寫信):
# writeLink = dr.find_element_by_link_text("寫信")
writeLink = _dr.find_element(By.ID,"composebtn")
writeLink.click()
根據標簽iframe的ID切換到寫信框架:
_dr.switch_to_frame("mainFrame")
收件人信息,根據xpath方法定位,這里不知道為什么你把箭頭指向收信人的時候是固定的div這里,
樓主在這里一直根據div里面class、style進行定位一直不能send.keys。其實是要定位到input,
其實自己想一下收件人,登錄等操作的tag通常是input。
_dr.find_element_by_xpath("//*[@id='toAreaCtrl']/div/input").send_keys(_receiverAddress)
根據元素的ID進行定位(主題信息):
_dr.find_element(By.ID,"subject").send_keys(_subjectString)
郵件正文信息,這里要說明下這里的ID級NAME是變化的,這個時候可以根據tag或者class_name,xpath方法進行定位:
#dr.switch_to_frame(dr.find_element_by_tag_name("iframe"))
_dr.switch_to_frame(_dr.find_element_by_class_name("qmEditorIfrmEditArea"))
_dr.find_element_by_tag_name("body").send_keys(_contentString)
webDriver只能在一個頁面上對元素識別和定位,對於frame/iframe表單內嵌頁面上的元素無法直接定位,
此時就需要通過switch_to.frame()方法將當前定位的主題切換為iframe表單的內嵌頁面中:
_dr.switch_to.parent_frame()
_dr.find_element_by_link_text("發送").click()
_dr.implicitly_wait(5)
接下來就是函數的封裝了,自己填入收件人、正文等,這里不再做陳述,有疑問歡迎留言!
# ---------------------
# 作者:sobbing_child
# 來源:QiYe005
# 原文:https://www.cnblogs.com/aanb/
# 版權聲明:本文為博主原創文章,轉載請附上博文鏈接
: