Python?Selenium彈窗處理操作指南
HTML中的彈窗
1、在實際系統(tǒng)中,在完成某些操作時會彈出對話框來提示,主要分為"警告消息框","確認消息框","提示消息對話"三種類型的對話框
2、警告消息框:alert
?、啪嫦⒖蛱峁┝艘粋€"確定"按鈕讓用戶關(guān)閉該消息框,并且該消息框是模式對話框,也就是說用戶必須先關(guān)閉該消息框然后才能繼續(xù)進行操作
3、確認消息框(confirm)
⑴確認消息框向用戶提示一個"是與否"問題,用戶可以根據(jù)選擇"確定"按鈕和"取消"按鈕
4、提示消息對話(prompt)
⑴提示消息框提供了一個文本字段,用戶可以在此字段輸入一個答案來響應(yīng)您的提示
⑵該消息框有一個"確定"按鈕和一個"取消"按鈕。選擇"確認"會響應(yīng)對應(yīng)的提示信息,選擇"取消"會關(guān)閉對話框
Selenium定位彈窗
1、在Selenium中如果只是簡單的對彈窗進行定位的話,是定位不到的
2、因為這種彈窗是不屬于HTML的元素的,它是屬于瀏覽器自帶的彈窗(是由JavaScript生成的),所以用定位元素的方法是定位不了的
⑴這類元素在使用F12選擇元素時,是選擇不到的
3、Selenium中的WebDriver對象提供了switch_to_alert()方法定位(捕獲)到各種彈窗(alert、confirm、prompt)
4、WebDriver對象在處理彈框時主要有以下幾種方法:
⑴switch_to_alert():定位彈出的對話框
⑵text:獲取對話框文本值
⑶accept():相當(dāng)于點擊"確認"
⑷dismiss():相當(dāng)于點擊"取消"
⑸send_keys():輸入值,該方法只能在prompt類彈框中使用
5、基本思路:先利用方法switch_to_alert()定位到alert等彈出框,再進行相應(yīng)的處理(確認、取消、輸入值)
⑴注意:對于三種類型的彈出框定位到彈出框的方法都一樣
alert
1、alert類彈出框應(yīng)該是實際中遇到最多的彈出框之一
例1:
import time from selenium import webdriver # 獲取瀏覽器對象 driver = webdriver.Chrome() # 設(shè)置瀏覽器窗口大小 driver.maximize_window() # 進入百度首頁 driver.get('https://www.baidu.com/') # 進入百度設(shè)置頁面 driver.find_element_by_xpath("http://*[@id='s-usersetting-top']").click() # 打開"搜索設(shè)置" driver.find_element_by_xpath("http://*[@id='s-user-setting-menu']/div/a[1]").click() time.sleep(1) # 點擊保存設(shè)置 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click() # 此時就會彈出alter類對話框,使用switch_to_alert()定位到彈窗 alter = driver.switch_to_alert() print(alter) print(driver.switch_to.alert) # 打印對話框內(nèi)容 print(alter.text) # 點擊對話框[確定]按鈕以關(guān)閉對話框 alter.accept() time.sleep(2) #關(guān)閉對話框后繼續(xù)操作頁面 driver.find_element_by_id("kw").send_keys("不怕貓的耗子A") """ <selenium.webdriver.common.alert.Alert object at 0x000001EDE7BBA7F0> <selenium.webdriver.common.alert.Alert object at 0x000001EDE7BC8D68> 已經(jīng)記錄下您的使用偏好 """
注:
1、在編輯器中寫switch_to_alert()方法時會出現(xiàn)橫線(刪除線),這個表示該方法太老了,后面可能會放棄使用
⑴因此我們還可以使用switch_to.alert方法
2、兩個方法稍微有點差距
⑴switch_to_alert():是類方法
⑵switch_to.alert:是類屬性
⑶但是兩者的返回值都是一樣的:都是一個alter對象
3、彈框肯定是在當(dāng)前Selenium指向的窗口中的(在同一頁面中),因此在關(guān)閉彈出框后,可繼續(xù)操作本頁面的元素
confirm
1、這種彈出框也是比較常見,但是在網(wǎng)上沒找到類似的彈出框,就寫了一個demo
例2:
<html> <head> <script type="text/javascript"> function show_confirm() { var r=confirm("請問:您是否關(guān)注了我的博客?"); } </script> </head> <body> <center> <input id="anjing" type="button" onclick="show_confirm()" value="點我,點我有驚喜!" /> <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> </center> </body> </html>
例3:
import time from selenium import webdriver # 獲取瀏覽器對象 driver = webdriver.Chrome() # 設(shè)置瀏覽器窗口大小 driver.maximize_window() # 進入頁面 driver.get('C:\\Py_Demo\\Demo\\Py_Project\\demo.html') # 點擊按鈕并彈出對話框 driver.find_element_by_id("mouse").click() time.sleep(1) # 定位對話框 alter = driver.switch_to.alert print(alter) # 打印對話框內(nèi)容 print(alter.text) # 點擊對話框[確定]按鈕以關(guān)閉對話框 # alter.accept() # 點擊對話框[取消]按鈕以關(guān)閉對話框 alter.dismiss() time.sleep(1) #關(guān)閉對話框后繼續(xù)操作頁面 driver.find_element_by_id("kw").send_keys("不怕貓的耗子A") """ <selenium.webdriver.common.alert.Alert object at 0x0000028242C68DA0> 請問:您是否關(guān)注了我的博客? """
prompt
1、這種彈出框應(yīng)該很少,在網(wǎng)上沒找到類似的彈出框,就寫了一個demo
例4:
<html> <head> <script type="text/javascript"> function disp_prompt() { var name=prompt("請問:您關(guān)注我的博客了嗎?") } </script> </head> <body> <center> <input id="mouse" type="button" onclick="disp_prompt()" value="點我,點我有驚喜" /> <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> </center> </body> </html>
例5:
import time from selenium import webdriver # 獲取瀏覽器對象 driver = webdriver.Chrome() # 設(shè)置瀏覽器窗口大小 driver.maximize_window() # 進入頁面 driver.get('C:\\Py_Demo\\Demo\\Py_Project\\demo.html') # 點擊按鈕并彈出對話框 driver.find_element_by_id("mouse").click() time.sleep(1) # 定位對話框 alter = driver.switch_to.alert print(alter) # 打印對話框內(nèi)容 print(alter.text) # 發(fā)送文字至對話框 alter.send_keys("不怕貓的耗子A") time.sleep(2) # 點擊對話框[確定]按鈕以關(guān)閉對話框 # alter.accept() # 點擊對話框[取消]按鈕以關(guān)閉對話框 alter.dismiss() time.sleep(1) #關(guān)閉對話框后繼續(xù)操作頁面 driver.find_element_by_id("kw").send_keys("不怕貓的耗子A") """ 注:在這個例子中感覺send_keys()沒啟作用(沒有發(fā)送文職到輸入框),不知道為什么 <selenium.webdriver.common.alert.Alert object at 0x0000018EDC058E48> 請問:您關(guān)注我的博客了嗎? """
其他方法
1、定位彈出框不僅可以使用上面的"switch_to.alert"和"switch_to_alert()"方法
2、還可以通過其他方法進行跳轉(zhuǎn)到alert
⑴這里需要用到Alert模塊,首先進行導(dǎo)入from selenium.webdriver.common.alert import Alert
例6:
import time from selenium import webdriver from selenium.webdriver.common.alert import Alert # 獲取瀏覽器對象 driver = webdriver.Chrome() # 設(shè)置瀏覽器窗口大小 driver.maximize_window() # 進入百度首頁 driver.get('https://www.baidu.com/') # 進入百度設(shè)置頁面 driver.find_element_by_xpath("http://*[@id='s-usersetting-top']").click() # 打開"搜索設(shè)置" driver.find_element_by_xpath("http://*[@id='s-user-setting-menu']/div/a[1]").click() time.sleep(1) # 點擊保存設(shè)置 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click() # 此時就會彈出alter類對話框,使用Alert定位到彈窗 time.sleep(2) alter = Alert(driver) # 打印對話框內(nèi)容 print(alter.text) # 點擊對話框[確定]按鈕以關(guān)閉對話框 alter.accept() time.sleep(2) #關(guān)閉對話框后繼續(xù)操作頁面 driver.find_element_by_id("kw").send_keys("不怕貓的耗子A")
注:
1、alter = Alert(driver):相當(dāng)于是在當(dāng)前瀏覽器頁面中(WebDriver對象下)實例化了一個alter對象
判斷彈出框
1、執(zhí)行代碼過程中,可能會因為其他因素,網(wǎng)速慢等情況導(dǎo)致彈出框沒有出現(xiàn),我們可以通過判斷元素中判斷彈出框時否出現(xiàn)來進行操作
2、具體方法是使用Selenium中的"顯示等待"和判"斷元素是否存在"的方法
⑴至于這兩個知識點,后面會單獨介紹,這里了解下就好了
例7:
import time from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 獲取瀏覽器對象 driver = webdriver.Chrome() # 設(shè)置瀏覽器窗口大小 driver.maximize_window() # 進入百度首頁 driver.get('https://www.baidu.com/') # 進入百度設(shè)置頁面 driver.find_element_by_xpath("http://*[@id='s-usersetting-top']").click() # 打開"搜索設(shè)置" driver.find_element_by_xpath("http://*[@id='s-user-setting-menu']/div/a[1]").click() time.sleep(1) # 點擊保存設(shè)置 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click() # 此時就會彈出alter類對話框,使用Alert定位到彈窗 WebDriverWait(driver, 5).until(EC.alert_is_present()) # 等待5秒后判斷是否彈出窗口出現(xiàn) """ 類似于 time.sleep(5) result = EC.alert_is_present()(driver) #判斷是否有對話框,這里的寫法需要注意下 print(result) if result: pass else: print("未彈出對話框") """ alter = driver.switch_to.alert # 打印對話框內(nèi)容 print(alter.text) # 點擊對話框[確定]按鈕以關(guān)閉對話框 alter.accept() time.sleep(2) #關(guān)閉對話框后繼續(xù)操作頁面 driver.find_element_by_id("kw").send_keys("不怕貓的耗子A")
拓展
對話框
1、對話框:是不屬于HTML的元素的,它是屬于瀏覽器自帶的,用元素定位是定位不到的
2、在實際中一定要分清楚是否是對話框
3、比如點擊[登錄]按鈕,會彈出一個小面板(網(wǎng)頁層級之上的頁面)。這種不是對話框。而是網(wǎng)頁本身的一部分,這種是可以使用元素定位的
⑴比如前面例子中的"百度首頁的設(shè)置面板":點擊[設(shè)置]后彈出的小面板,這種是可以定位到的
例8:登錄粉筆網(wǎng)
import time from selenium import webdriver # 獲取瀏覽器對象 driver = webdriver.Chrome() # 設(shè)置瀏覽器窗口大小 driver.maximize_window() # 進入粉筆網(wǎng) driver.get('https://fenbi.com/page/home') # 點擊登錄按鈕 driver.find_element_by_xpath('//*[@id="headercontent"]/div[2]/div/div[1]').click() # 輸入賬號 driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[1]/input').send_keys("賬號") # 輸入密碼 driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[2]/input').send_keys("密碼") # 點擊登錄按鈕 driver.find_element_by_xpath('//*[@id="fenbi-web-header"]/fb-header/div[2]/div/div[2]/div[4]/div/div').click()
總結(jié)
到此這篇關(guān)于Python Selenium彈窗處理的文章就介紹到這了,更多相關(guān)Python Selenium彈窗處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows系統(tǒng)IIS部署Django項目的實踐
采用IIS服務(wù)器部署相比django提供的開發(fā)者服務(wù)器具有更好的并發(fā)訪問能力,性能更加穩(wěn)定,本文主要介紹了windows系統(tǒng)IIS部署Django項目的實踐,具有一定的參考價值,感興趣的可以了解一下2022-03-03class類在python中獲取金融數(shù)據(jù)的實例方法
在本篇文章里小編給大家整理了關(guān)于class類怎樣在python中獲取金融數(shù)據(jù)的相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-12-12Python實現(xiàn)刪除Android工程中的冗余字符串
這篇文章主要介紹了Python實現(xiàn)刪除Android工程中的冗余字符串,本文實現(xiàn)的是刪除Android資源(語言)國際化機制中的一些冗余字符串,需要的朋友可以參考下2015-01-01python實現(xiàn)簡單的學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細介紹了python實現(xiàn)簡單的學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-02-02python循環(huán)控制之break和continue流程控制語句
這篇文章主要介紹了python循環(huán)控制之break流程控制語句,Python中提供了兩個關(guān)鍵字用來控制循環(huán)語句,分別是break和continue,本文都有介紹,需要的朋友可以參考一下2022-03-03pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題
這篇文章主要介紹了pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11