Selenium switch_to方法

測試開發小記發表於2020-12-27

在web應用自動化測試中,點選一個連結或者按鈕會開啟一個新的瀏覽器視窗,會出現多個視窗例項。預設情況下的焦點在主視窗(父視窗),如果要對子視窗進行操作,就需要首先切換到子視窗。

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

iframe切換

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

什麼是frame?

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

演示程式碼:https://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切換

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

切換iframe,列印'請拖拽我'元素文字

def test_iframe(self):
      self.driver.get("https://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("https://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("http://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("http://www.baidu.com")
	js = "window.open('http://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元素。有時候需要測試開啟一個網頁,焦點是否在輸入框,比如賬號密碼登入頁面。

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

python程式碼:

def test_element_focus(self):
    self.driver.get("https://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
本文連結:https://hiyong.gitee.io/posts/selenium-switch_to/
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!

相關文章