最近在用selenium 寫一個測試腳本,前期已經寫好了;后來可能是需求更新的原因頁面的跳轉方式改變了。點擊某些按鈕后會打開一個新的窗口因為句柄發生了變化導致無法定位元素。
報錯是這樣的: “ selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable ”
因為窗口句柄還停留在上一個頁面,所以導致無法定位元素。報錯 “元素不可交互”。
因此要解決的問題就是先定位到當前頁面(也就是跳轉后的頁面)然后再進行元素的定位。
首先我們來看一下 switch_to.window()方法的使用:
handles = driver.window_handles #獲取當前瀏覽器的所有窗口句柄 driver.switch_to.window(handles[-1]) #切換到最新打開的窗口 driver.switch_to.window(handles[-2]) #切換到倒數第二個打開的窗口 driver.switch_to.window(handles[0]) #切換到最開始打開的窗口
獲取當前網頁句柄:driver.current_window_handle
switch_to.window(windowhandles)方法來對瀏覽器頁面進行切換,其中參數windowhandles為網頁的窗口句柄。
切換window需要注意:如果前一個頁面操作還沒完成便切換window,會導致前一頁面未完成的操作操作失敗,進而程序拋錯。
這里我遇到的問題只需要切換到最新窗口句柄就行。
接下來看一下部分代碼:
def login(self, url, data_username, data_passwd): self.browser.get(url) self.browser.maximize_window() username = self.browser.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[5]/div/form/div[1]/div/div/div/input') ActionChains(self.browser).double_click(username).perform() self.browser.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[5]/div/form/div[1]/div/div/div/input').send_keys(data_username) passwd = self.browser.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[5]/div/form/div[2]/div/div/div/input') ActionChains(self.browser).double_click(passwd).perform() self.browser.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[5]/div/form/div[2]/div/div/div/input').send_keys(data_passwd) self.browser.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[5]/div/form/div[5]/button').click() # 登陸成功 time.sleep(2) self.browser.find_element_by_xpath('//*[@id="app"]/div/div[1]/div[2]/a[2]').click() # 點擊此按鈕會跳轉到新的窗口 time.sleep(1.5) handles = self.browser.window_handles # 獲取當前瀏覽器所有窗口句柄 self.browser.switch_to.window(handles[-1]) # 切換最新窗口句柄
只需要在跳轉到新窗口之后切換到最新窗口的句柄,就可以定位到元素了。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
因為遇到的問題比較簡單,在這里就不再展開了。