一、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 webdriverfrom time import sleepdriver = 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()# 切换iframedriver.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()# 退出iframedriver.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 webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom time import sleepdriver = 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出现,自动切换iframeWebDriverWait(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()# 退出iframedriver.switch_to.default_content()sleep(3) driver.quit()
二、selenium中window切换方法:
方法一:switch_to.window
百度搜索腾讯课堂并打开
from selenium import webdriverfrom 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_handlesprint('切换之前的窗口{}'.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 webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom 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_handlesprint('切换之前的窗口{}'.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()