python selenium中iframe切换、window切换方法
一、selenium中iframe切换方法:
方法一:switch_to.frame
frame函数中提供了三种定位方法:by index, name, or webelement。
-
- 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() # 退出iframe driver.switch_to.default_content() 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() # 退出iframe driver.switch_to.default_content() 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(switch.window_handles[-1]) print('切换至后的窗口{}'.format(driver.current_window_handle)) # 点击登录按钮 driver.find_element_by_id('js_login').click()