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時,要經過:
switch_to.alert
方法將webdriver作用域切換到alert提示框上。- 現在,我們可以使用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一樣:
switch_to.alert
方法將webdriver作用域切換到alert提示框上。- 現在,我們可以使用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一樣:
switch_to.alert
方法將webdriver作用域切換到alert提示框上。- 現在,我們可以使用text獲取提示文本信息、accept()點擊確認按鈕、dismiss()點擊取消或者叉掉提示框。
- 現在可以使用
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