selenium自動化測試工具可以模擬人的部分操作,包括點擊、拖動和填寫等,用起來很方便。但它並不是萬能的,而且現在selenium對模態對話框的處理還不是很完善。當然,對於一些簡單的彈框,還是有方法處理的。
比如下面這種:
driver.find_element_by_xpath(login_button).click() # 點擊登錄
while True: # 直到輸入正確的驗證碼以後,才繼續後續流程
try:
driver.switch_to.alert.accept() # 點擊確定按鈕
# switch_to_alert() --定位彈出對話框
# text() --獲取對話框文本值
# accept() --相當於點擊“確認”
# dismiss() --相當於點擊“取消”
# send_keys() --輸入值(如果有輸入對話框)
except NoAlertPresentException: # 沒有彈窗,說明驗證碼輸入正確,退出循環
break
else:
print("請在網頁重新輸入正確的驗證碼!")
time.sleep(LONG_PROTECTION_TIME / 2) # 等待重新輸入正確的驗證碼
driver.find_element_by_xpath(login_button).click() # 點擊登錄
但是如果碰到下面這種,就沒那麼容易處理了:
這種彈窗屬於瀏覽器的一些插件, 用F12也無法定位彈窗裏邊的元素。雖然selenium也有按照座標進行點擊的功能,但讓selenium按照座標自動去點擊彈窗裏邊的東西就更困難了,而且還涉及到文本框的填寫等。
這個時候,就是該用 time.sleep()的時候了,留出足夠長的等待時間,讓人工手動對彈窗進行處理,只要保證selenium在進行下一步操作之前把彈框給點掉,後續流程就可以繼續正常運行。當然,人的操作不能與selenium中的程序處理操作相沖突,不能對selenium的後續處理邏輯造成影響。