Selenium switch_to方法

在web應用自動化測試中,點擊一個鏈接或者按鈕會打開一個新的瀏覽器窗口,會出現多個窗口實例。默認情況下的焦點在主窗口(父窗口),如果要對子窗口進行操作,就需要首先切換到子窗口。

Selenium WebDriver給每個窗口指定了一個唯一的ID,Selenium通過這個唯一ID實現在多個窗口之間切換。常見的有iframe,彈出對話框alert,新窗口等。本文將介紹這幾種窗口的切換。

iframe切換

在web自動化中,如果一個元素定位始終不到,如果locator沒有寫錯,很大概率就是這個元素在iframe中。

什麼是frame?

frame是html中的框架,通過使用frameset 標籤將頁面進行垂直或者水平分離。包含frameset、frame、 iframe三種標籤。

演示程式碼://www.w3school.com.cn/tiy/t.asp?f=html_frame_cols

frame切換

切換到frame或者iframe後就可以進行操作,操作完成後需要切換回原來的框架:

driver.switch_to.frame() #根據元素id或 index切換
driver.switch_to.default_content() #切換到默認 frame
driver.switch_to.parent_frame() #切換到父級 frame

多 frame切換

測試頁面://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

切換iframe,列印’請拖拽我’元素文本

def test_iframe(self):
      self.driver.get("//www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
      self.driver.switch_to.frame("iframeResult")
      print(self.driver.find_element_by_id("draggable").text) # 列印'請拖拽我'
      # self.driver.switch_to.parent_frame()
      self.driver.switch_to.default_content()
      print(self.driver.find_element_by_id("submitBTN").text) #點擊運行

彈出對話框alert切換

在頁面操作時會遇到 JavaScript所生成的alert、 confirm以及prompt彈框,需要對彈框操作後才能進行下一步。

操作alert常用的方法

  1. switch_to.alert():切換到當前頁面上的警告框
  2. text:返回彈框文本資訊
  3. accept():接受彈框,確認
  4. dismiss():取消彈框
  5. send_keys(keysToSend):發送文本至彈框

alert切換

測試頁面還是上面的頁面,拖拽後會出現一個彈框,我們列印彈框內容並點擊確定。

python程式碼:

def test_alert(self):
      self.driver.get("//www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
      self.driver.switch_to.frame("iframeResult")
      drag = self.driver.find_element_by_id("draggable")
      drop = self.driver.find_element_by_id("droppable")
      action = ActionChains(self.driver)
      action.drag_and_drop(drag, drop).perform()
      sleep(2)
      alert = self.driver.switch_to.alert
      print(alert.text)
      alert.accept()
      # self.driver.switch_to.alert.accept()
      self.driver.switch_to.default_content()
      self.driver.find_element_by_id("submitBTN").click()
      sleep(3)

多窗口切換

有時候點擊某些鏈接會打開一個新的窗口,需要先切換窗口才能在新頁面上操作。selenium通過切換窗口句柄來進行多個窗口之間的切換。

處理流程

  1. 獲取當前的窗口句柄(driver.current_window_handle)
  2. 獲取當前會話下的所有窗口句柄(driver.window_handles)
  3. 切換窗口(driver.switch_to_window)
  4. 切回原窗口(driver.switch_to_window)

多窗口切換

1、打開百度,點擊登錄,進入註冊介面,返回登錄頁

python程式碼:

def test_window(self):
      self.driver.get("//www.baidu.com")
      self.driver.find_element_by_link_text("登錄").click()
      # print(self.driver.current_window_handle) # 當前的窗口句柄
      self. driver.find_element_by_link_text("立即註冊").click()
      windows = self.driver.window_handles # 所有窗口句柄

      # 切換到註冊窗口
      self.driver.switch_to.window(windows[-1])
      self.driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("username")
      self.driver.find_element_by_id("TANGRAM__PSP_4__phone").send_keys("12345678")
      sleep(2)

      # 切換回登錄窗口
      self.driver.switch_to.window(windows[0])
      self.driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()

2、打開新窗口

def test_window2(self):
	self.driver.get("//www.baidu.com")
	js = "window.open('//www.sogou.com')"
	self.driver.execute_script(js)
	sleep(3)
	windows = self.driver.window_handles
	print(windows)
	# 切換到新打開的窗口
	self.driver.switch_to.window(windows[-1])
	self.driver.find_element_by_id("query").send_keys("test sogou") # 搜狗搜索框
	sleep(3)
	self.driver.close() # 關閉新打開的窗口
	# 切回窗口
	self.driver.switch_to.window(windows[0])
	self.driver.find_element_by_id("kw").send_keys("test baidu") # 百度搜索框
	sleep(3)

獲取當前焦點元素

switch_to還有一個方法叫switch_to.active_element,返回當前焦點的WebElement對象,用於判斷當前焦點是否位於某個web元素。有時候需要測試打開一個網頁,焦點是否在輸入框,比如帳號密碼登錄頁面。

測試:打開//www.baidu.com/,焦點在輸入框

python程式碼:

def test_element_focus(self):
    self.driver.get("//www.baidu.com/")
    baidu = self.driver.find_element_by_id("kw")
    assert baidu == self.driver.switch_to.active_element

–THE END–

文章標題:Selenium switch_to方法
本文作者:hiyo
本文鏈接://hiyong.gitee.io/posts/selenium-switch_to/
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!