Python+Selenium實現Web自動化問題定位過程:等待頁面加載及不同窗口切換問題


本文內容皆為作者原創,碼字不易,如需轉載,請注明出處: https://www.cnblogs.com/temari/p/13087898.html

 今天使用Python+Selenium+PyCharm寫了一個Web自動化小程序練習Xpath定位,在調試程序的過程中發現代碼未執行完瀏覽器就關閉了,但是后台並沒有報錯。經過百度后推測是等待時間的問題,訪問官網查閱Selenium-Python-API,查閱隱式等待和顯示等待用法,修改腳本完善代碼,繼續調試。調試過程中發現腳本在不同窗口進行切換時報NoSuchElementException異常,經問題分析和定位,使用switch_to.window()方法完美解決。整個代碼調試過程花費了很長時間,但在整個問題解決過程,一步一步的探索,在解決一個問題的同時發現新的問題,環環相扣,頗有成就感。本來一個簡單的小程序,靠着敏銳的直覺,嗅到了一絲bug的氣息,一路過關斬將,既鍛煉了問題分析的能力,也順便學習了Selenium-Python-API。我把整個問題定位的過程記錄下來,便於后面的學習。

一,Web自動化環境配置

Python3.8.3+PyCharm 2020.2.1+Selenium+Win10 64位

,Web自動化小程序功能

程序功能:訪問百度首頁,點擊新聞超鏈接,進入新聞頁面后退出瀏覽器。

網站地址

百度首頁,如圖:

百度新聞,如圖:

三,問題定位過程

整個調試過程中,代碼共經歷了V1.0.0-V1.0.4五個版本,其中V1.0.0和V1.0.2代碼存在問題,V1.0.1(強制等待),V1.0.3(隱式等待)和V1.0.4(顯示等待)調試成功,分別為強制等待,隱式等待和顯示等待的代碼實現方法,效果是一樣的。

3.1 版本V1.0.0

存在問題: 代碼未執行完,瀏覽器就關閉了。

問題分析: 推測是點擊“新聞”超鏈接進入下一個頁面時,未加等待時間,頁面未加載完成,就執行退出瀏覽器語句了。

代碼如圖

3.2 版本V1.0.1 【強制等待調試成功】

強制等待:在腳本中設置固定時間的休眠,程序中導入time模塊,使用sleep()即可。

代碼優化:進入下一個頁面時添加等待時間,引入time模塊,使用sleep()方法,強制等待幾秒鍾。

調試結果: 程序調試正常,前台網頁成功打開,點擊“新聞”超鏈接,進入新聞頁面,瀏覽器正常退出並關閉,版本V1.0.0問題解決。

問題定位: V1.0.0版本代碼,新聞頁面未進入瀏覽器就退出的問題確實是未加等待時間的原因導致。

代碼如圖

3.3 版本V1.0.2

隱式等待:設置一定的時長等待頁面上的某元素加載完成,如果超過了設置的時長,元素仍未被加載,則拋出NoSuchElementException異常。WebDriver提供了implicitly_wait()方法來實現隱式等待,默認等待時間設置為0秒。設置的等待時長並非一個固定的等待時間,它並不影響腳本的執行速度。其次,它並不針對頁面上的某一元素進行等待。

代碼優化:在V1.0.1基礎上添加等待時間,使用implicitly_wait()方法,並判斷頁面元素是否存在,然后退出瀏覽器。
調試結果: 前台跳轉正常,后台報NoSuchElementException異常,selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element。
問題分析: “貼吧”超鏈接Xpath定位語法寫錯,等待時間不夠長,或者其他別的錯誤。
代碼如圖

問題定位:新建py文件,修改代碼,瀏覽器直接訪問“http://news.baidu.com”,驗證Xpath語法是否正確。

代碼如圖

經驗證在百度新聞頁面,代碼沒有問題。如圖:

分析結論:通過百度首頁,點擊超鏈接進入百度新聞頁面,百度新聞頁面的元素定位報NoSuchElementException異常,推測是未切換窗口導致的。

3.4 版本V1.0.3 【隱式等待調試成功】

代碼優化:在V1.0.2基礎上使用switch_to.window()方法,實現在不同的窗口之間切換。

調試結果: 前台跳轉正常,后台無報錯,調試成功。

代碼如圖

3.5 版本V1.0.4【顯示等待調試成功】

顯示等待:需要使用WebDriver提供的WebDriverWait類,顯示等待將等待時間設置為一個固定的時長,在設置時間內,默認每隔一段時間檢測一次當前頁面上的某一元素是否存在,如果超過設置時間檢測不到則拋出異常。

代碼優化:頁面加載采用顯示等待方式,使用WebDriverWait類,實現不同窗口切換,使用switch_to.window()方法。

調試結果: 前台跳轉正常,后台無報錯,調試成功。

代碼如圖

程序調試成功!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM