1. 程式人生 > 其它 >email郵件中 內嵌iframe_第二章(第7節):多視窗或多iframe切換

email郵件中 內嵌iframe_第二章(第7節):多視窗或多iframe切換

技術標籤:email郵件中 內嵌iframe

在頁面操作過程中有時候點選某個連結會彈出新的視窗或標籤頁,這時就需要主機切換到新開啟的視窗或標籤頁上進行操作,我們使用的 WebDriver 對視窗或標籤頁的切換使用的函式是一樣的,故在本節學習中,為了方便描述,我們統一使用視窗。

在 Web 應用中經常會遇到 frame/iframe 表單巢狀頁面的應用,WebDriver 只能在一個頁面上對元素識別與定位,對於 frame/iframe 表單內嵌頁面上的元素無法直接定位。這時就需要通過 switch_to.frame() 方法將當前定位的主體切換為 frame/iframe 表單的內嵌頁面中。

多視窗之間切換

WebDriver 提供了 switch_to.window() 方法,可以實現在不同的視窗之間切換。以百度首頁和百度註冊頁為例,在兩個標籤頁之間的切換程式碼如下。

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

# 獲得百度搜索視窗控制代碼
sreach_windows = driver.current_window_handle

driver.find_element_by_link_text('登入').click()
driver.find_element_by_link_text("立即註冊").click()

# 獲得當前所有開啟的視窗的控制代碼
all_handles = driver.window_handles

# 進入註冊視窗
for handle in all_handles:
    if handle != sreach_windows:
        driver.switch_to.window(handle)  # 切換到下一個視窗
        print('now register window!')
        driver.find_element_by_name("account").send_keys('username')
        driver.find_element_by_name('password').send_keys('password')
        time.sleep(2)
        # ……

driver.quit()

多 iframe 切換

我們以 126 郵箱登入框頁面為例,該頁面中有一個子頁面 iframe,我們下面列出該頁面的部分程式碼。

<html>
  <body>
  ...
  <iframe id="x-URS-iframe" ...>
    <html>
      <body>
      ...
      <input name="email" >

想要操作登入框必須要先切換到 iframe 表單才能找到的該元素,然後才能去操作。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.126.com")

driver.switch_to.frame('x-URS-iframe')  # 跳進該 iframe 頁面
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()      # 跳回最外層的頁面

driver.quit()

switch_to.frame() 預設可以直接取表單的 id 或 name 屬性,如果 iframe 沒有可用的 id 和 name 屬性,則可以先定位到該 iframe 元素,直接把該元素本身傳入給 switch_to.frame() 函式。

# 先通過 xpth 定位到 iframe,當然你可以根據前面學的任何定位方法來定位
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')

# 再將定位元素傳給 switch_to.frame() 方法
driver.switch_to.frame(xf)

閱讀原文:

多視窗或多iframe切換​www.birdpython.com e803afeb3cfb52e19895b7376eed4bdb.png