在實際定位元素的過程中,發現有一種情況讓人很是惱火,根據xpath路徑定位,感覺像是沒錯哦,但是執行時就來一個報錯信息……為什么呢?
多表單切換
例如我們登錄網易郵箱時就會發現,定位登錄框時,一個嵌套的頁面讓定位變得如同相隔千山萬水……
此時就需要切換表單來解救了:
慣例慣例~
# coding=utf-8 from selenium import webdriver dr = webdriver.Chrome() dr.get("https://mail.163.com/") dr.switch_to_frame("x-URS-iframe") dr.find_element_by_name("email").clear() dr.find_element_by_name("email").send_keys("username") dr.find_element_by_name("password").clear() dr.find_element_by_name("password").send_keys("password") dr.find_element_by_id("dologin").click() dr.switch_to_default_content() dr.quit()
通過switch_to_frame切換到登錄表單中,之后就可以按照之前定位元素的方法定位元素並輸入信息了。
當然如果想切換回源頁面,可以直接使用 switch_to_default_content() 返回默認的最外層頁面中。
多窗口切換
還有的情況就需要仔細甄別了,是不是通過鏈接打開了一個新的窗口…
來來來,最近時事比較熱的新聞來看一看~
# coding=utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC dr = webdriver.Chrome() dr.get("https://www.baidu.com") dr.find_element_by_name("tj_trnews").click() window_0 = dr.current_window_handle try: element = WebDriverWait(dr, 10).until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="pane-news"]/div/ul/li[1]/strong/a'))) element.click() window_1 = dr.current_window_handle windows = dr.window_handles print(window_0, window_1, "\n", windows) dr.switch_to_window(windows[-1]) window_1 = dr.current_window_handle print(window_0, window_1, "\n", windows) time.sleep(5) finally: dr.quit()
通過上述代碼執行,可以看出,我為了打開百度新聞的熱點新聞中的頭條真的真的做出了一系列努力
代碼中結合之前學習的顯示等待,因為在測試過程執行的過程中發生了百度新聞的頁面未完成加載未能找到熱點新聞對應的元素的情況,自然也就無法定位給出了報錯信息,心想繼續使用time.sleep(5)着實是有點low,用上之前學習的顯式等待吧。
在執行過程中,模擬鼠標點擊熱點新聞的第一行之后看到打開了一個新的標簽頁,但是我們通過 current_window_handle 查看當前窗口的句柄時,發現雖然打開了新的標簽頁,但是焦點並未聚焦於新的標簽頁,仍舊停留在原始頁面,如果需要在新的頁面中執行操作,怎么辦?
通過 windows = dr.window_handles 獲取所有窗口頁面的句柄,再通過 dr.switch_to_window(windows[-1]) 切換到最新的窗口頁面,此時再來查看當前的窗口句柄,就發現,已然切換成功了,有成就感~