在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常用的方法
- switch_to.alert():切換到當前頁面上的警告框
- text:返回彈框文字資訊
- accept():接受彈框,確認
- dismiss():取消彈框
- 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通過切換視窗控制程式碼來進行多個視窗之間的切換。
處理流程
- 獲取當前的視窗控制程式碼(driver.current_window_handle)
- 獲取當前會話下的所有視窗控制程式碼(driver.window_handles)
- 切換視窗(driver.switch_to_window)
- 切回原視窗(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
文章標題:Selenium switch_to方法
本文作者:hiyo
本文連結:https://hiyong.gitee.io/posts/selenium-switch_to/
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!