python selenium中iframe切換、window切換方法
阿新 • • 發佈:2018-11-20
一、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 importsleep 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()