彈出框有幾種類型,一般為alart, iframe, windows(包括可直接識別的div,還有不能能直接識別的),下面我們以百度首頁為例,看看這幾種彈出框如何識別。
假設現在要在百度首頁點擊登錄按鈕
等如下窗口彈出來后, 點擊qq圖標轉向qq登錄
然后,頁面會跳轉到第3方窗口,在里面選擇賬戶密碼登錄
然后在如下彈出框里輸入用戶名和密碼
我們直接代碼看下如何實現,注意,以下下代碼僅僅證明可行性,未作任何優化,工程代碼應該利用設計模式(PageObject)/分離元素和操作/封裝重用類/定義錯誤處理。
import time from selenium import webdriver #打開首頁,點擊登錄按鈕 d = webdriver.Chrome() d.get("http://www.baidu.com") d.find_element_by_xpath(".//*[@id='u1']/a[@name='tj_login']").click() #jquery操作頁面元素,點擊qq賬戶登錄。 #1. 這是彈出框問題的終極解決辦法,一律用jquey直接操作頁面元素,然后通過腳本執行 js_script ='''$("#pass_phoenix_btn .phoenix-btn-item")[0].click()''' time.sleep(2) d.execute_script(js_script) time.sleep(2) #切換到qq登錄頁面,並打印出當前頁面以驗證正確性。 #2. switch_to.window允許你跟彈出頁面window交互。 for handle in d.window_handles: d.switch_to.window(handle) time.sleep(3) print(d.current_url) #分析頁面元素,看出最終的賬戶登錄是個iframe,找到這個iframe的id,切入到這個iframe,繼續執行操作。 #3. iframe也可以用switch_to.frame直接操作。 element = d.find_element_by_xpath(".//*[@id='combine_page']/div[1]") d.switch_to.frame(element.find_element_by_id('ptlogin_iframe')) d.find_element_by_xpath(".//*[@id='switcher_plogin']").click()