一, 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 中 Windows 切换方法:
方法一: switch_to.Windows
百度搜索腾讯课堂并打开
- 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.Windows(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.Windows(driver.window_handles[-1])
- print('切换至后的窗口 {}'.format(driver.current_window_handle))
- # 点击登录按钮
- driver.find_element_by_id('js_login').click()
来源: http://www.bubuko.com/infodetail-2854285.html