Selenium處理alert等提示框


About

重新認識alert
首先,不是所有的alert都能叫做alert框。
JavaScript中,關於消息提示框的方法有三個(雖然都跟alert差不多):

  • alert(message)方法用於顯示帶有一條指定消息和一個 OK 按鈕的警告框。
  • confirm(message)方法用於顯示一個帶有指定消息和 OK 及取消按鈕的對話框。如果用戶點擊確定按鈕,則 confirm() 返回 true。如果點擊取消按鈕,則 confirm() 返回 false。
  • prompt(text,defaultText)方法用於顯示可提示用戶進行輸入的對話框。如果用戶單擊提示框的取消按鈕,則返回 null。如果用戶單擊確認按鈕,則返回輸入字段當前顯示的文本。

來看個示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>alert</title>
</head>
<body>

<input type="button" id="alertButton" value="alert" onclick="alertButton()">
<input type="button" id="confirmButton" value="confirm" onclick="confirmButton()">
<input type="button" id="promptButton" value="prompt" onclick="promptButton()">
<script> function alertButton() { alert('我是普通的alert提示框'); }; function confirmButton() { var msg = confirm('點擊[確定]或者[取消]按鈕'); if (msg) { alert('你點擊的是[確定按鈕]'); } else { alert('你點擊的是[取消按鈕]'); } }; function promptButton() { var msg = prompt('輸入一個值:', '我是默認值'); if (msg) { alert('輸入的值為:\n' + msg); } else { alert('輸入值為空'); } }; </script>
</body>
</html>

selenium如何處理?
selenium操作上面三種提示框有以下幾種方法:

  • alertObject.text:獲取提示的文本值。
  • alertObject.accept():點擊『確認』按鈕。
  • alertObject.dismiss():點擊『取消』或者叉掉對話框。
  • alertObject.send_keys(message):輸入文本,僅適用於prompt方法,因為alert和confirm的提示框沒有輸入框!!!並且,如果在非prompt類型的提示框使用alertObject.send_keys(message),會報錯!

whatever,因為這些消息提示框的特性,我們『檢查 or F12』都無法選中提示框。所以,selenium在處理起來,首先要經過一個switch_to的過程。
另外,當你看到提示框只有提示信息和一個確定按鈕時,它就是alert提示框;當你看到提示框中有提示信息和確定/取消按鈕都在時,它就是confirm提示框;當你看到提示信息和input框,並且確定和取消按鈕都在時,它就是prompt提示框。
至於,為什么不提提示框中右上角的叉掉圖標,這是根據瀏覽器的不同,有的有這個圖標,有的沒有,比如Chrome和Firefox就沒有,而IE就有。

selenium處理alert提示框

selenium在處理alert時,要經過:

  1. switch_to.alert方法將webdriver作用域切換到alert提示框上。
  2. 現在,我們可以使用text獲取提示文本信息、accept()點擊確認按鈕、dismiss()點擊取消或者叉掉提示框。
import time
from selenium import webdriver

driver = webdriver.Chrome()
try:

    driver.get(url='file:///M:/tests.html')  # 注意這里是三個/// 
    time.sleep(2)
    driver.find_element_by_id('alertButton').click()
    time.sleep(1)
    alertObject = driver.switch_to.alert  # 這里,alert方法不加括號,以為該方法被 @property 偽裝成屬性了,具體參考源碼
    print(alertObject.text)  # text方法也被 @property 偽裝成屬性了
    alertObject.accept()  # 點擊確定按鈕

    time.sleep(2)
    driver.find_element_by_id('alertButton').click()
    time.sleep(1)
    alertObject = driver.switch_to.alert
    time.sleep(2)
    alertObject.dismiss()  # 叉掉提示框

    time.sleep(2)
    driver.find_element_by_id('alertButton').click()
    time.sleep(1)
    alertObject = driver.switch_to.alert
    alertObject.send_keys('這一行會報錯')  # selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: User dialog does not have a text box input field.


finally:
    time.sleep(10)
    driver.quit()

由最后的報錯可以看到,alert提示框中不能使用alertObject.send_keys(message)方法。

selenium處理confirm提示框

selenium在處理confirm時,與處理alert一樣:

  1. switch_to.alert方法將webdriver作用域切換到alert提示框上。
  2. 現在,我們可以使用text獲取提示文本信息、accept()點擊確認按鈕、dismiss()點擊取消或者叉掉提示框。
import time
from selenium import webdriver

driver = webdriver.Chrome()
try:

    driver.get(url='file:///M:/tests.html')
    time.sleep(2)
    driver.find_element_by_id('confirmButton').click()
    time.sleep(1)
    alertObject = driver.switch_to.alert
    print(alertObject.text)  # 打印提示信息
    time.sleep(1)
    alertObject.accept()  # 點擊確定按鈕
    time.sleep(1)
    alertObject.accept()  # 根據前端js代碼邏輯,當點擊確定按鈕后會再彈出一個提示框,我們再次點擊確定
    time.sleep(2)
    driver.find_element_by_id('confirmButton').click()
    time.sleep(1)
    alertObject = driver.switch_to.alert
    alertObject.send_keys('這一行會報錯')  # selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: User dialog does not have a text box input field.


finally:
    time.sleep(10)
    driver.quit()

同樣的,confirm提示框中也不能使用alertObject.send_keys(message)方法。

selenium處理prompt提示框

selenium在處理prompt時,與處理alert/confirm一樣:

  1. switch_to.alert方法將webdriver作用域切換到alert提示框上。
  2. 現在,我們可以使用text獲取提示文本信息、accept()點擊確認按鈕、dismiss()點擊取消或者叉掉提示框。
  3. 現在可以使用alertObject.send_keys(message)方法了。
import time
from selenium import webdriver

driver = webdriver.Chrome()
try:

    driver.get(url='file:///M:/tests.html')
    time.sleep(2)
    driver.find_element_by_id('promptButton').click()
    time.sleep(1)
    alertObject = driver.switch_to.alert
    print(alertObject.text)  # 打印提示信息
    time.sleep(1)
    alertObject.send_keys('send keys msg')
    print(alertObject.text)  # 打印提示信息
    alertObject.accept()  # 點擊確定按鈕
    print(alertObject.text)  # 打印提示信息
    time.sleep(1)
    alertObject.accept()  # 根據前端js代碼,當點擊確定按鈕后會再彈出一個提示框,我們再次點擊確定
    time.sleep(2)
    driver.find_element_by_id('promptButton').click()
    time.sleep(1)
    alertObject = driver.switch_to.alert
    alertObject.send_keys('')
    time.sleep(1)
    alertObject.dismiss()  # 什么都不管,直接點擊取消,會在彈出一個提示框
    time.sleep(1)
    # 現在彈出的是一個普通的提示框,點擊確定和取消都無所謂,具體根據業務場景來決定
    # alertObject.accept()
    alertObject.dismiss()


finally:
    
    time.sleep(10)
    driver.quit()

在prompt提示框中,要看到input框才能send keys!


see also: alert | confirm | prompt | 自動化測試基礎篇--Selenium彈出框alert


免責聲明!

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



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