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()
python selenium中iframe切换、window切换方法的更多相关文章
- Python selenium中注入并执行Javascript语句
众所周知,Python通常结合selenium模块来完成一些web的自动化测试以及RPA(Robotic Process Automation)工作.事实上,Selenium还可以支持插入js语句.执 ...
- python+selenium的frame表单切换
switch_to.frame() 切换frame switch_to.default_content() 切 ...
- selenium中的多窗口切换
在selenium中,我们会遇到一些问题,就是多窗口处理的问题,我们爬取的内容在一个新窗口上,这个时候,我们就需要先切换到这个新的窗口上,然后进行抓取内容. 如何切换呢? 首先,获取当前窗口句柄 1. ...
- python+selenium五:多窗口切换与获取句柄
from selenium import webdriverfrom selenium.webdriver.common.by import Byimport time driver = webdri ...
- python+selenium:iframe框架中多种定位
方法一:通过索引,id,name,WebElement定位 from selenium import webdriverdriver = webdriver.Firefox()driver.switc ...
- python多线程中join()方法和setDaemon()方法的区别
""" join()方法:主线程A中,创建了子线程B,并且在主线程中调用了B.join()方法,那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行 ...
- Python: 类中为什么要定义__init__()方法
学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...
- selenium中iframe的切换
#第一层是默认层, 第二层是新建标签的层,第三层是百度的那层from selenium import webdriverimport timedriver=webdriver.Chrome()driv ...
- python+selenium之多表单切换
在Web应用中经常会遇到fram/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于fram/iframe表单内嵌套页面上的元素无法直接定位.这是需要通过swit ...
随机推荐
- bootstrap-datepicker 时间范围选择函数封装
bootstrap-datepicker 时间范围选择函数封装 官网 https://bootstrap-datepicker.readthedocs.io/en/latest/index.html ...
- python脚本1_给一个半径求圆的面积和周长
#给一个半径,求圆的面积和周长,圆周率3.14 r = int(input('r=')) print('area='+str(3.14*r*r)) print('circumference='+str ...
- request获取路径方式
从request获取各种路径总结 request.getRealPath("url"); // 虚拟目录映射为实际目录 request.getRealPath("./&q ...
- 十一 web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 /@x 表示查找指定属性的值,可以连缀如:@id @src [@属性名称= ...
- wc.exe(c语言实现)
Github项目地址:https://github.com/zhongciting2009/wc WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写 ...
- YYMMDD转YYYY-MM-DD
date.replace(/(\d{4})(\d{2})(\d{2})/g,'$1-$2-$3');
- TF随笔-3
>>> import tensorflow as tf>>> node1 = tf.constant(3.0, dtype=tf.float32)>>& ...
- python中的赋值与拷贝(浅拷贝与深拷贝)
1.赋值与拷贝 直接赋值(b=a)是传引用,b改动a也会改动. a = [1, 2, 3, 4] b = a b[1] = 999 print(a, b) #[1, 999, 3, 4] [1, 99 ...
- 毕业生、程序猿转岗该如何选择Java、大数据和VR?
许久不见的朋友请我吃饭,期间给我介绍他一个弟弟,说明年要毕业了,还不知道找啥工作,说有培训机构让他学VR.大数据什么的,不知道前景咋样,想咨询一下我.相信很多朋友面临毕业,都不知道该从事哪个行业,自己 ...
- struts1和struts2原理解析
1.struts1和struts2 是2个完全不同的框架 其实struts2核心就是 webwork框架 struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截 ...