web自動化測試第11步:switch_to包詳解:切換handle、frame、alert

在之前的三節裏,我們分別對窗口切換(handle)、frame切換、彈窗(alert)切換做了詳細的解釋,但是我們在寫代碼的時候發現,這些方法都被編輯器劃傷了一條橫線,但是方法還是可以正常使用,只是目前的pycharm不推薦你繼續這樣使用了(有新的方法可以替代它),那如果我們不使用這些方法的話,我們該怎麼去完成切換窗口、frame這些操作呢?所以我們來學習一下替代這幾個方法的switch_to包。

不被推薦的方法

一、switch_to包的方法詳解

在switch_to的基礎上,有這麼幾個方法,鑑於基本上都是之前曾經講過的,這次把等價的方法也列出來,供大家參考

方法介紹 已經棄用方法 switch_to包的方法
定位到當前聚焦的元素上 driver.switch_to_active_element() driver.switch_to.active_element()   
切換到alert彈窗 driver.switch_to_alert() driver.switch_to.alert()      
切換到主頁面 driver.switch_to_default_content() driver.switch_to.default_content()       
通過id、name、element(定位的某個元素)、索引來切換到某個frame driver.switch_to_frame(frame_reference) driver.switch_to.frame(frame_reference)     
切換到指定的window_name頁籤 driver.switch_to_window(window_name) driver.switch_to.window(window_name)
  • driver.switch_to.parent_frame()

這是switch_to中獨有的方法,可以切換到上一層的frame,對於層層嵌套的frame很有用

注: 官方把selenium.webdriver包中的switch方法全部封裝成了一個包,這樣能夠比較明瞭和方便,也符合軟件編程中的高內聚低耦合的思想。

二、實際案例展示

 

這節我們再來把163郵箱登錄的例子來用新的switch_to方法寫一下,並通過觀察,我們發現進入這個頁面後焦點直接就定位到輸入框裏了,所以我們可以通過active_element()來定位。

163switc_to包

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()

# 進入163郵箱首頁
driver.get("http://mail.163.com/")
sleep(2)

# 切換到包含登錄框的frame下
driver.switch_to.frame(1)

# 通過定位輸當前焦點元素,並再次輸入數據
ele_box = driver.switch_to.active_element
ele_box.send_keys("123")

三、關於switch_to源碼

class SwitchTo:
    def __init__(self, driver):
        self._driver = driver

    @property
    def active_element(self):
        """
        Returns the element with focus, or BODY if nothing has focus.

        :Usage:
            element = driver.switch_to.active_element
        """
        if self._driver.w3c:
            return self._driver.execute(Command.W3C_GET_ACTIVE_ELEMENT)
        else:
            return self._driver.execute(Command.GET_ACTIVE_ELEMENT)['value']

    @property
    def alert(self):
        """
        Switches focus to an alert on the page.

        :Usage:
            alert = driver.switch_to.alert
        """
        return Alert(self._driver)

    def default_content(self):
        """
        Switch focus to the default frame.

        :Usage:
            driver.switch_to.default_content()
        """
        self._driver.execute(Command.SWITCH_TO_FRAME, {'id': None})

    def frame(self, frame_reference):
        """
        Switches focus to the specified frame, by index, name, or webelement.

        :Args:
         - frame_reference: The name of the window to switch to, an integer representing the index,
                            or a webelement that is an (i)frame to switch to.

        :Usage:
            driver.switch_to.frame('frame_name')
            driver.switch_to.frame(1)
            driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
        """
        if isinstance(frame_reference, basestring) and self._driver.w3c:
            try:
                frame_reference = self._driver.find_element(By.ID, frame_reference)
            except NoSuchElementException:
                try:
                    frame_reference = self._driver.find_element(By.NAME, frame_reference)
                except NoSuchElementException:
                    raise NoSuchFrameException(frame_reference)

        self._driver.execute(Command.SWITCH_TO_FRAME, {'id': frame_reference})

    def parent_frame(self):
        """
        Switches focus to the parent context. If the current context is the top
        level browsing context, the context remains unchanged.

        :Usage:
            driver.switch_to.parent_frame()
        """
        self._driver.execute(Command.SWITCH_TO_PARENT_FRAME)

    def window(self, window_name):
        """
        Switches focus to the specified window.

        :Args:
         - window_name: The name or window handle of the window to switch to.

        :Usage:
            driver.switch_to.window('main')
        """
        data = {'name': window_name}
        if self._driver.w3c:
            data = {'handle': window_name}
        self._driver.execute(Command.SWITCH_TO_WINDOW, data)

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章