程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python Selenium彈窗處理操作指南

編輯:Python

目錄

HTML中的彈窗

Selenium定位彈窗

alert

confirm

prompt

其他方法

判斷彈出框

拓展

對話框

總結

HTML中的彈窗

1、在實際系統中,在完成某些操作時會彈出對話框來提示,主要分為"警告消息框","確認消息框","提示消息對話"三種類型的對話框

2、警告消息框:alert

⑴警告消息框提供了一個"確定"按鈕讓用戶關閉該消息框,並且該消息框是模式對話框,也就是說用戶必須先關閉該消息框然後才能繼續進行操作

3、確認消息框(confirm)

    ⑴確認消息框向用戶提示一個"是與否"問題,用戶可以根據選擇"確定"按鈕和"取消"按鈕

4、提示消息對話(prompt)

⑴提示消息框提供了一個文本字段,用戶可以在此字段輸入一個答案來響應您的提示

       ⑵該消息框有一個"確定"按鈕和一個"取消"按鈕。選擇"確認"會響應對應的提示信息,選擇"取消"會關閉對話框

Selenium定位彈窗

1、在Selenium中如果只是簡單的對彈窗進行定位的話,是定位不到的

2、因為這種彈窗是不屬於HTML的元素的,它是屬於浏覽器自帶的彈窗(是由JavaScript生成的),所以用定位元素的方法是定位不了的

    ⑴這類元素在使用F12選擇元素時,是選擇不到的

3、Selenium中的WebDriver對象提供了switch_to_alert()方法定位(捕獲)到各種彈窗(alert、confirm、prompt)

4、WebDriver對象在處理彈框時主要有以下幾種方法:

    ⑴switch_to_alert():定位彈出的對話框

    ⑵text:獲取對話框文本值

    ⑶accept():相當於點擊"確認"

    ⑷dismiss():相當於點擊"取消"

    ⑸send_keys():輸入值,該方法只能在prompt類彈框中使用

5、基本思路:先利用方法switch_to_alert()定位到alert等彈出框,再進行相應的處理(確認、取消、輸入值)

    ⑴注意:對於三種類型的彈出框定位到彈出框的方法都一樣

alert

1、alert類彈出框應該是實際中遇到最多的彈出框之一

例1:

import timefrom selenium import webdriver# 獲取浏覽器對象driver = webdriver.Chrome()# 設置浏覽器窗口大小driver.maximize_window()# 進入百度首頁driver.get('https://www.baidu.com/')# 進入百度設置頁面driver.find_element_by_xpath("//*[@id='s-usersetting-top']").click()# 打開"搜索設置"driver.find_element_by_xpath("//*[@id='s-user-setting-menu']/div/a[1]").click()time.sleep(1)# 點擊保存設置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)# 打印對話框內容print(alter.text)# 點擊對話框[確定]按鈕以關閉對話框alter.accept()time.sleep(2)#關閉對話框後繼續操作頁面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>已經記錄下您的使用偏好"""

注:

1、在編輯器中寫switch_to_alert()方法時會出現橫線(刪除線),這個表示該方法太老了,後面可能會放棄使用

    ⑴因此我們還可以使用switch_to.alert方法

2、兩個方法稍微有點差距

    ⑴switch_to_alert():是類方法

    ⑵switch_to.alert:是類屬性

    ⑶但是兩者的返回值都是一樣的:都是一個alter對象

3、彈框肯定是在當前Selenium指向的窗口中的(在同一頁面中),因此在關閉彈出框後,可繼續操作本頁面的元素

confirm

1、這種彈出框也是比較常見,但是在網上沒找到類似的彈出框,就寫了一個demo

例2:

<html><head><script type="text/javascript"> function show_confirm() { var r=confirm("請問:您是否關注了我的博客?"); }</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 timefrom selenium import webdriver# 獲取浏覽器對象driver = webdriver.Chrome()# 設置浏覽器窗口大小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.alertprint(alter)# 打印對話框內容print(alter.text)# 點擊對話框[確定]按鈕以關閉對話框# alter.accept()# 點擊對話框[取消]按鈕以關閉對話框alter.dismiss()time.sleep(1)#關閉對話框後繼續操作頁面driver.find_element_by_id("kw").send_keys("不怕貓的耗子A")"""<selenium.webdriver.common.alert.Alert object at 0x0000028242C68DA0>請問:您是否關注了我的博客?"""prompt

1、這種彈出框應該很少,在網上沒找到類似的彈出框,就寫了一個demo

例4:

<html><head><script type="text/javascript"> function disp_prompt() { var name=prompt("請問:您關注我的博客了嗎?") }</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 timefrom selenium import webdriver# 獲取浏覽器對象driver = webdriver.Chrome()# 設置浏覽器窗口大小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.alertprint(alter)# 打印對話框內容print(alter.text)# 發送文字至對話框alter.send_keys("不怕貓的耗子A")time.sleep(2)# 點擊對話框[確定]按鈕以關閉對話框# alter.accept()# 點擊對話框[取消]按鈕以關閉對話框alter.dismiss()time.sleep(1)#關閉對話框後繼續操作頁面driver.find_element_by_id("kw").send_keys("不怕貓的耗子A")"""注:在這個例子中感覺send_keys()沒啟作用(沒有發送文職到輸入框),不知道為什麼<selenium.webdriver.common.alert.Alert object at 0x0000018EDC058E48>請問:您關注我的博客了嗎?"""其他方法

1、定位彈出框不僅可以使用上面的"switch_to.alert"和"switch_to_alert()"方法

2、還可以通過其他方法進行跳轉到alert

    ⑴這裡需要用到Alert模塊,首先進行導入from selenium.webdriver.common.alert import Alert 

例6:

import timefrom selenium import webdriverfrom selenium.webdriver.common.alert import Alert# 獲取浏覽器對象driver = webdriver.Chrome()# 設置浏覽器窗口大小driver.maximize_window()# 進入百度首頁driver.get('https://www.baidu.com/')# 進入百度設置頁面driver.find_element_by_xpath("//*[@id='s-usersetting-top']").click()# 打開"搜索設置"driver.find_element_by_xpath("//*[@id='s-user-setting-menu']/div/a[1]").click()time.sleep(1)# 點擊保存設置driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()# 此時就會彈出alter類對話框,使用Alert定位到彈窗time.sleep(2)alter = Alert(driver)# 打印對話框內容print(alter.text)# 點擊對話框[確定]按鈕以關閉對話框alter.accept()time.sleep(2)#關閉對話框後繼續操作頁面driver.find_element_by_id("kw").send_keys("不怕貓的耗子A")

注:

1、alter = Alert(driver):相當於是在當前浏覽器頁面中(WebDriver對象下)實例化了一個alter對象

判斷彈出框

1、執行代碼過程中,可能會因為其他因素,網速慢等情況導致彈出框沒有出現,我們可以通過判斷元素中判斷彈出框時否出現來進行操作

2、具體方法是使用Selenium中的"顯示等待"和判"斷元素是否存在"的方法
    ⑴至於這兩個知識點,後面會單獨介紹,這裡了解下就好了

例7:

import timefrom selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 獲取浏覽器對象driver = webdriver.Chrome()# 設置浏覽器窗口大小driver.maximize_window()# 進入百度首頁driver.get('https://www.baidu.com/')# 進入百度設置頁面driver.find_element_by_xpath("//*[@id='s-usersetting-top']").click()# 打開"搜索設置"driver.find_element_by_xpath("//*[@id='s-user-setting-menu']/div/a[1]").click()time.sleep(1)# 點擊保存設置driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()# 此時就會彈出alter類對話框,使用Alert定位到彈窗WebDriverWait(driver, 5).until(EC.alert_is_present()) # 等待5秒後判斷是否彈出窗口出現"""類似於time.sleep(5)result = EC.alert_is_present()(driver) #判斷是否有對話框,這裡的寫法需要注意下print(result)if result: passelse: print("未彈出對話框")"""alter = driver.switch_to.alert# 打印對話框內容print(alter.text)# 點擊對話框[確定]按鈕以關閉對話框alter.accept()time.sleep(2)#關閉對話框後繼續操作頁面driver.find_element_by_id("kw").send_keys("不怕貓的耗子A")拓展對話框

1、對話框:是不屬於HTML的元素的,它是屬於浏覽器自帶的,用元素定位是定位不到的

2、在實際中一定要分清楚是否是對話框

3、比如點擊[登錄]按鈕,會彈出一個小面板(網頁層級之上的頁面)。這種不是對話框。而是網頁本身的一部分,這種是可以使用元素定位的

    ⑴比如前面例子中的"百度首頁的設置面板":點擊[設置]後彈出的小面板,這種是可以定位到的

例8:登錄粉筆網

import timefrom selenium import webdriver# 獲取浏覽器對象driver = webdriver.Chrome()# 設置浏覽器窗口大小driver.maximize_window()# 進入粉筆網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()總結

到此這篇關於Python Selenium彈窗處理的文章就介紹到這了,更多相關Python Selenium彈窗處理內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved