1. 程式人生 > >python selenium中iframe切換、window切換方法

python selenium中iframe切換、window切換方法

一、selenium中iframe切換方法:

    方法一:switch_to.frame

      frame函式中提供了三種定位方法:

    •   driver.switch_to.frame('frame_name')
    •   driver.switch_to.frame(1)
    •   driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])

  以騰訊課堂為例:

from selenium import webdriver
from time import
sleep driver = webdriver.Chrome() driver.get('https://ke.qq.com/') driver.implicitly_wait(20) driver.maximize_window() # 點選登入 driver.find_element_by_id('js_login').click() # 點選QQ登陸 driver.find_element_by_xpath('//div[@class="content-btns"]/a[1]').click() # 切換iframe driver.switch_to.frame('login_frame_qq
') # 點選賬號密碼登陸 driver.find_element_by_id('switcher_plogin').click() # 輸入帳號 driver.find_element_by_id('u').send_keys('*********') # 輸入密碼 driver.find_element_by_id('p').send_keys('*********') # 點選登入 driver.find_element_by_id('login_button').click() sleep(3) driver.quit()

    方法二:expected_conditions中frame_to_be_available_and_switch_to_it

      實現步驟:結合顯性等待方法,等待iframe框出現後自動切換iframe,其方法內部呼叫了 switch_to.frame 方法(可以看原始碼),所以定位iframe的方法與方法一相同。

  以騰訊課堂為例:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

driver = webdriver.Chrome()
driver.get('https://ke.qq.com/')
driver.implicitly_wait(20)
driver.maximize_window()
# 點選登入
driver.find_element_by_id('js_login').click()
# 點選QQ登陸
driver.find_element_by_xpath('//div[@class="content-btns"]/a[1]').click()
# 等待iframe出現,自動切換iframe
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it("login_frame_qq"))
# 點選賬號密碼登陸
driver.find_element_by_id('switcher_plogin').click()
# 輸入帳號
driver.find_element_by_id('u').send_keys('*********')
# 輸入密碼
driver.find_element_by_id('p').send_keys('*********')
# 點選登入
driver.find_element_by_id('login_button').click()

sleep(3)
driver.quit()

 

二、selenium中window切換方法:

    方法一:switch_to.window

  百度搜索騰訊課堂並開啟  

from selenium import webdriver
from time import sleep

# 設定瀏覽器配置,取消‘Chrome正在受到自動軟體的控制’的提示語
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
# 開啟chrome瀏覽器,並執行設定
driver = webdriver.Chrome(chrome_options=option)
driver.implicitly_wait(30)
driver.maximize_window()
# 開啟百度首頁
driver.get("https://www.baidu.com")
# 輸入 騰訊課堂
driver.find_element_by_id('kw').send_keys('騰訊課堂')
# 點選 百度一下
driver.find_element_by_id("su").click()
# 獲取所有視窗
windows = driver.window_handles
print('切換之前的視窗{}'.format(windows))
# 點選騰訊課堂連結
driver.find_elements_by_xpath('//a[text()="_專業的線上教育平臺(ke.qq.com)"]')[0].click()
# 切換到新視窗
driver.switch_to.window(driver.window_handles[-1])
print('切換至後的視窗{}'.format(driver.current_window_handle))
# 點選登入按鈕
driver.find_element_by_id('js_login').click()

 

     方法二:expected_conditions中new_window_is_opened

      實現步驟:結合顯性等待方法,等待新視窗開啟,再進行切換

  百度搜索騰訊課堂並開啟

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

# 設定瀏覽器配置,取消‘Chrome正在受到自動軟體的控制’的提示語
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
# 開啟chrome瀏覽器,並執行設定
driver = webdriver.Chrome(chrome_options=option)
driver.implicitly_wait(30)
driver.maximize_window()
# 開啟百度首頁
driver.get("https://www.baidu.com")
# 輸入 騰訊課堂
driver.find_element_by_id('kw').send_keys('騰訊課堂')
# 點選 百度一下
driver.find_element_by_id("su").click()
# 獲取所有視窗
windows = driver.window_handles
print('切換之前的視窗{}'.format(windows))
# 點選騰訊課堂連結
driver.find_elements_by_xpath('//a[text()="_專業的線上教育平臺(ke.qq.com)"]')[0].click()
# 判斷新視窗開啟
WebDriverWait(driver,10).until(EC.new_window_is_opened(windows))
# 切換到新視窗
driver.switch_to.window(driver.window_handles[-1])
print('切換至後的視窗{}'.format(driver.current_window_handle))
# 點選登入按鈕
driver.find_element_by_id('js_login').click()