Python3+selenium 報錯處理:「selenium.common.exceptions.NoAlertPresentException: Message: No alert is acti

1、說明

在使用python3+selenium寫自動升級程序的時侯,碰到一個彈出對話框須要點擊確認的場景。彈出的對話框以下圖所示。html

對於彈框各類資料都說經過switch_to.alert屬性獲取對話框對象,而後使用該對象的accept()方法點擊確認。python

但使用該方法,一直報錯:「selenium.common.exceptions.NoAlertPresentException: Message: No alert is active」,截圖以下:jquery

 

2、對話框處理

2.1 基本消息框處理

JavaScript中有三種基本的消息:警告框、確認框、提示框;分別使用alert()、confirm()、prompt()彈出;形式依次以下:web

對於這三種消息框,和網上大多數資料說的同樣用以下幾個方法進行處理:瀏覽器

# 定義瀏覽器
browser = webdriver.Firefox()
# 打開url
browser.get(url)
# 切換至消息框,適用於alert/confirm/prompt
alert_box = browser.switch_to.alert
# 點擊消息框的確認按鈕,返回值爲true。適用於alert/confirm/prompt
alert_box.accept()
# 點擊消息框的取消按鈕,返回值爲False。適用於confirm/prompt
alert_box.dismiss()
# 向輸入框發送內容,適用於prompt
alert_box.send_keys("msg")
# 獲取輸入框內容,適用於prompt
alert_box.text

 

2.2 模態對話框處理

在理解中,非模態對話框是指不進行處理也能點擊其餘位置的對話框,模態對話框則是指不處理就不能點擊頁面其餘位置的對話框。架構

按這定義,前面說的三種消息框也應該都算模態對話框;但我對html的一些術語不是很瞭解,反正咱們這裏就約定剔除前面三種彈出形式、而後又須要進行處理才能點擊頁面其餘位置的對話框稱爲模態對話框。框架

在第一大節中使用switch_to.alert之因此報錯,是由於該對話框並非第二大節中所說的三種消息框,而是一個使用其餘方法彈出的模態對話框(彷佛是jquery框架彈出的,細節沒研究);模態對話框不能經過switch_to.alert獲取。ide

 

2.1.1 取巧方法----使用switch_to.active_element確認按鈕而後點擊

在第一大節中能夠看到,「OK」按鈕處於激活狀態,咱們正是要點擊「OK」按鈕,因此咱們可使用switch_to.active_element獲取「OK」對象,而後進行點擊。url

# 切換至激活狀態控件
element = browser.switch_to.active_element
# 調用click()方法點擊該按鈕
element.click()

 

2.2.2 通用的方法----直接經過find_element_by_id()等定位按鈕而後點擊

在3.1中介紹的方法不夠通用,假如「OK」不處於激活狀態或者咱們要點擊的是「Cancel」按鈕,這種方法就行不通了。spa

第二大節介紹的三種消息對話框沒有相應的html代碼---即經過查看頁面源代碼看不到相應的html代碼----但模態對話框在彈出時是有相應的html代碼的(未彈出時沒有),也就是說咱們徹底能夠像獲取普通控件同樣,經過find_element_by_id()等方法獲取控件對象。

如上能夠看到「OK」控件id爲「btnYO」,因此直接代碼就是:

browser.find_element_by_id("btnYO").click()

 

3、更加輕巧的selenium代碼書寫方法

前面所說的兩種方法基本能夠處理咱們如何關閉彈窗的問題,但一是咱們要判斷對話框是什麼對話框,二是在判斷爲模態對話框以後咱們還得進行點擊查看源代碼而後提取xpath等操做。

也許一次兩次這樣的操做工做量還可接受,但若是不少時就比較煩,咱們能夠藉助更輕鬆的方法實現;這種方法其實不僅對處理對話框,對使用selenium操做頁面的代碼的編寫都是一種頗有用的方法。

那就是使用Selenium IDE的代碼導出功能,使用Selenium IDE記錄整個點擊過程後,將過程導出爲Python等語言的代碼,咱們就能夠輕鬆地知道想要的點擊操做在代碼上的實現;固然新版本的Selenium IDE導出代碼已暫不可用(應該是Firefox等架構調整致使其原先代碼不可用而新代碼又沒寫好),但咱們可使用Katalon Recorder等代替品來實現。

固然,這也不是說之後你想寫一個selenium操做頁面的代碼,都直接使用Katalon Recorder開啓記錄,而後把整個過程的操做一下,最後再導出代碼就萬事大吉了。主要是由於Katalon Recorder等並不能清楚地知道你進行下一步前的判斷標準,也不知道異常以後你想進行的操做。好比你想等待一個按鈕加載完可點擊以後進行點擊,若是不能點擊就再等一下;但Katalon Recorder並不知道你的這個思想過程,他只以爲整個過程就是你等了5秒就點擊了某個控件。即Katalon Recorder是一大助力但也只是一大助力而不是萬能鑰匙。

 

參考:

https://www.runoob.com/js/js-popup.html

https://stackoverflow.com/questions/50089367/cant-see-file-edit-actions-menu-bar-on-firefox-selenium-ide

相關文章
相關標籤/搜索