中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

selenium+python實現自動登陸QQ郵箱并發送郵件功能

發布時間:2020-09-02 12:11:14 來源:腳本之家 閱讀:324 作者:小末的夏天 欄目:開發技術

本期做一個selenium詳細實例,會把我在元素定位中遇到的一些阻塞和經驗分享給大家。
(瀏覽器為Chrome)

(如果只需要最終的完整代碼,請直接跳轉到文章最后)

瀏覽器打開QQ郵箱登錄網址

QQ郵箱登錄地址為:https://mail.qq.com/

 from selenium import webdriver
 import time
 zhengyi = webdriver.Chrome()
 zhengyi.get('https://mail.qq.com/')

這一步沒有遇到問題,至于為什么導入時間庫,后面會說。

元素定位,輸入QQ賬號和QQ密碼

手動進入QQ郵箱登錄網頁,按下F12打開開發者工具,點擊查看元素,選擇元素:

selenium+python實現自動登陸QQ郵箱并發送郵件功能

可以看到QQ賬號輸入框的id、name等屬性,都是可以直接拿來定位的好選擇。
我這里選擇最通用的xpath方法來定位,id=‘u',并用send事件輸入QQ賬號

(也可以用zhengyi.find_element_by_id(‘u')來定位,代碼更清晰,不過我個人習慣采用通用的xpath)

zhengyi.find_element_by_xpath('//*[@id="u"]').send_keys("XXXXXXXXX")

同理,QQ密碼元素屬性id=‘p',同樣定位方法

zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("XXXXXXXX")

再同理,登錄按鈕元素屬性id=‘login_button',這里不需要發送信息,所以選擇click點擊事件

zhengyi.find_element_by_xpath('//*[@id="login_button"]').click()

好的,原則上到此為止,運行pycharm應該是能夠輸入賬號和密碼,并登陸成功。

but事情沒有那么簡單,運行后發現,selenium報錯,無法找到id為u的元素。

進過仔細觀察,發現是frame嵌套頁面在作怪。

我們可以這樣理解,每一個網頁都是一個父類的frame,從我們訪問這個網址開始,就已經進入了這個父類frame嵌套。顧名思義,有父即有子。frame(父)里嵌套了iframe(子),如果我們要定位的元素在iframe里,那么我們需要先切換至iframe。
iframe也是有自己的元素屬性的,selenium也提供了switch方法供我們使用

重新F12往上找iframe信息,可以看到被iframe嵌套了,id和name都是‘login_frame'

selenium+python實現自動登陸QQ郵箱并發送郵件功能

在定位元素之前,先輸入如下代碼:

zhengyi.switch_to.frame("login_frame")

這樣就切換到iframe了,再繼續之前的元素定位,即可成功。
這一步的完整代碼為:

 # 定位login_frame
 zhengyi.switch_to.frame("login_frame")
 zhengyi.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
 # 定位賬號、密碼,并輸入
 zhengyi.find_element_by_xpath('//*[@id="u"]').send_keys("839811794")
 zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("199306zy")
 # 定位登錄按鈕
 zhengyi.find_element_by_xpath('//*[@id="login_button"]').click()

這個時候網頁已經可以成功QQ郵箱。

元素定位,寫信界面

繼續,郵箱登錄成功之后,來到寫信界面,按照常規操作,我們需要先點擊左上角寫信按鈕,展開具體寫信界面

同樣的方法,F12操作起來,查看寫信按鈕,元素定位為id=‘composebtn',發送點擊事件

 # 定位寫信按鈕
 zhengyi.find_element_by_xpath('//*[@id="composebtn"]').click()

這個時候調試程序,網頁成功打開結果為selenium定位不到id為composebtn的元素。
這個時候就暴露了在上一個環節中出現的問題,之前的代碼將嵌套切換到了iframe的login_frame中,而此時的寫信元素,不在iframe中,所以在定位之前,需要先離開這個嵌套,返回到主文檔中

zhengyi.switch_to.default_content()

這樣嵌套就切換到主文檔了,再次運行程序,發現還是報錯

通過反復查資料,終于發現,寫信是在QQ登錄后才會出現的。如果我們登陸之后的瞬間就去定位寫信按鈕,這個時候受網速、PC的客觀影響,會定位不到元素。
我們只需要加一個sleep一秒,即可完美解決。(這個時候就體現了導入時間庫的作用了~)

#離開login_frame
 zhengyi.switch_to.default_content()
 #等待一秒
 time.sleep(1)
 # 定位寫信按鈕
 zhengyi.find_element_by_xpath('//*[@id="composebtn"]').click()

這樣即可定位到寫信按鈕,進入到了發郵件的步驟

元素定位,郵件發送

selenium+python實現自動登陸QQ郵箱并發送郵件功能

郵件內容編輯有四個部分,收件人、主題、正文,以及最后點擊發送按鈕

通過之前踩的坑,到了這一步,我對iframe嵌套變得格外小心,準備定位的每個元素都去觀察是否被iframe嵌套。
果不其然,“收件人”、“主題”和“發送”被主文檔下的mainFrame嵌套了,而“正文”又被mainFrame的子frame嵌套了。

so,這一步的邏輯為:

1、先切換到mainFrame,
2、分別定位 收件人 和 主題 ,調用發送事件
3、繼續切換到子frame
4、定位正文,調用發送事件
5、從子frame,返回到它的父frame,也即是mainFrame中
6、定位發送按鈕,調用點擊事件

這一步中,也有很多意向不到的坑:

1、定位收件人的時候,發現定位到的元素,還有子div,經過模擬,發現只有第二個子div才是真正能夠定位到收件人的元素,于是先定位id=‘toAreaCtrl',然后選擇第二個div中的input作為定位。
具體xpath定位內容為:“//*[@id=‘toAreaCtrl']/div[2]/input”

selenium+python實現自動登陸QQ郵箱并發送郵件功能

2.同樣是定位收件人遇到的問題,必須在切換到mainFrame后、定位收件人之前,加一個延遲執行,不然一定會無法定位到收件人元素。原因不明,所以我建議如果以后遇到元素定位不到,可以嘗試加一個time.sleep。

3.定位正文時,從mainFrame切換到iframe,發現iframe的id和name是動態的一串數字,但是switch_to.frame只支持固定id或者name。所以想了別的法子,先用iframe的class進行xpath定位,然后把傳給switch_to.frame來切換。具體為:

#切換到iframe
zhengyi.switch_to.frame(zhengyi.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))

selenium+python實現自動登陸QQ郵箱并發送郵件功能

4.郵件正文需要先調用一個點擊事件激活,才能啟動send事件。如果沒有先點擊再編寫,那么send的內容會放在主題后面的文本框中。(也不知道為啥會有這樣的設定~)

所以綜上所述,這一步的代碼為:

# 切換到mainFrame
zhengyi.switch_to.frame('mainFrame')
time.sleep(1)
# 定位收件人,并輸入
zhengyi.find_element_by_xpath("http://*[@id='toAreaCtrl']/div[2]/input").send_keys("XXXXXXXXX@qq.com")
# 定位主題,并輸入
zhengyi.find_element_by_xpath('//*[@id="subject"]').send_keys("來自zhengyi的郵件")
# 定位郵件正文,先進入到iframe
zhengyi.switch_to.frame(zhengyi.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))
# 必須先點擊正文,再send_keys
zhengyi.find_element_by_xpath('/html/body').click()
zhengyi.find_element_by_xpath('/html/body').send_keys("Hello World","\nZhengyi")
# 返回到mainframe
zhengyi.switch_to.parent_frame()
# 定位發送按鈕
zhengyi.find_element_by_xpath('//*[@name="sendbtn"]').click()

(就這么短短數十行,耗死了不少腦細胞)

元素定位總結

1、frame很重要,一定要看清楚是否被嵌套,以及注意切換
2、元素的id或者name如果是動態的,請放棄
3、用xpath定位真香
4、如果元素有子節點,使用相對路徑繼續定位
5、實在排查不出為什么定位失敗,嘗試一下用time.sleep()

最終程序代碼

from selenium import webdriver
#導入時間模塊
import time
# 注意大寫Chrome的C
zhengyi = webdriver.Chrome()
zhengyi.get('https://mail.qq.com/')
# 定位login_frame
zhengyi.switch_to.frame("login_frame")
zhengyi.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
# 定位賬號、密碼,并輸入
zhengyi.find_element_by_xpath('//*[@id="u"]').send_keys("839811794")
zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("199306zy")
# 定位登錄按鈕
zhengyi.find_element_by_xpath('//*[@id="login_button"]').click()
# 離開login_frame
# zhengyi.switch_to.parent_frame()
zhengyi.switch_to.default_content()
# 等待一秒
time.sleep(1)
# 定位寫信按鈕
zhengyi.find_element_by_xpath('//*[@id="composebtn"]').click()
# 切換到mainFrame
zhengyi.switch_to.frame('mainFrame')
time.sleep(1)
# 定位收件人,并輸入
zhengyi.find_element_by_xpath("http://*[@id='toAreaCtrl']/div[2]/input").send_keys("839811794@qq.com")
# 定位主題,并輸入
zhengyi.find_element_by_xpath('//*[@id="subject"]').send_keys("來自zhengyi發來的郵件")
# 定位郵件正文,先進入到iframe
zhengyi.switch_to.frame(zhengyi.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))
# 必須先點擊正文,再send_keys
zhengyi.find_element_by_xpath('/html/body').click()
zhengyi.find_element_by_xpath('/html/body').send_keys("Hello World","\nZhengyi")
# 返回到mainframe
zhengyi.switch_to.parent_frame()
# 定位發送按鈕
zhengyi.find_element_by_xpath('//*[@name="sendbtn"]').click()
time.sleep(5)
#關閉瀏覽器
zhengyi.quit()

tips

分享幾點在開發者工具里,比較方便的小竅門:

1、在開發者工具里,選中元素,點擊Console,可以很直觀的看到元素是否被iframe嵌套

selenium+python實現自動登陸QQ郵箱并發送郵件功能

2、Elements,選中想定位的元素,右鍵–COPY–Copy XPath,可以直接復制元素的xpath
3、希望您能給我分享一點tips

總結

以上所述是小編給大家介紹的selenium+python實現自動登陸QQ郵箱并發送郵件功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

琼结县| 夏邑县| 获嘉县| 芜湖市| 永平县| 合山市| 曲麻莱县| 奇台县| 杂多县| 渝中区| 普兰县| 金乡县| 连平县| 义乌市| 东丰县| 玉屏| 罗田县| 北川| 仙桃市| 长寿区| 阿拉尔市| 镇赉县| 徐闻县| 兴隆县| 嘉祥县| 九龙坡区| 临潭县| 武邑县| 太仓市| 潍坊市| 万安县| 沅江市| 扬州市| 乡宁县| 明星| 行唐县| 凉山| 武鸣县| 南靖县| 曲沃县| 昂仁县|