一、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切换方法的更多相关文章

  1. Python selenium中注入并执行Javascript语句

    众所周知,Python通常结合selenium模块来完成一些web的自动化测试以及RPA(Robotic Process Automation)工作.事实上,Selenium还可以支持插入js语句.执 ...

  2. python+selenium的frame表单切换

    switch_to.frame()                               切换frame switch_to.default_content()                切 ...

  3. selenium中的多窗口切换

    在selenium中,我们会遇到一些问题,就是多窗口处理的问题,我们爬取的内容在一个新窗口上,这个时候,我们就需要先切换到这个新的窗口上,然后进行抓取内容. 如何切换呢? 首先,获取当前窗口句柄 1. ...

  4. python+selenium五:多窗口切换与获取句柄

    from selenium import webdriverfrom selenium.webdriver.common.by import Byimport time driver = webdri ...

  5. python+selenium:iframe框架中多种定位

    方法一:通过索引,id,name,WebElement定位 from selenium import webdriverdriver = webdriver.Firefox()driver.switc ...

  6. python多线程中join()方法和setDaemon()方法的区别

    """ join()方法:主线程A中,创建了子线程B,并且在主线程中调用了B.join()方法,那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行 ...

  7. Python: 类中为什么要定义__init__()方法

    学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...

  8. selenium中iframe的切换

    #第一层是默认层, 第二层是新建标签的层,第三层是百度的那层from selenium import webdriverimport timedriver=webdriver.Chrome()driv ...

  9. python+selenium之多表单切换

    在Web应用中经常会遇到fram/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于fram/iframe表单内嵌套页面上的元素无法直接定位.这是需要通过swit ...

随机推荐

  1. java socket - 传递对象

    Person类: package com.zhyea.olproxy.socket; import java.io.Serializable; public class Person implemen ...

  2. docker之DockerSwarm的了解

    这次一起了解下docker Swarm,什么是dockerSwarm. 什么是docker Swarm 产品背景 使用docker的流程,ssh到一台服务器,运行docker命令来运行本机的docke ...

  3. 远程调用之RMI、Hessian、Burlap、Httpinvoker、WebService的比较

    一.综述 本文比较了RMI.Hessian.Burlap.Httpinvoker.WebService5这种通讯协议的在不同的数据结构和不同数据量时的传输性能. RMI是java语言本身提供的远程通讯 ...

  4. python学习笔记(SMTP邮件发送)

    想着给框架添加邮件发送功能.所以整理下python下邮件发送功能 首先python是支持邮件的发送.内置smtp库.支持发送纯文本.HTML及添加附件的邮件 之后是邮箱.像163.qq.新浪等邮箱默认 ...

  5. Mac环境下Android Studio配置Git以及最基本使用

    Git是分布式版本管理工具,现在使用十分广泛,相对于SVN,GIT的使用更加方便,在离线环境下,仍然可以进行版本控制工作.且速度十分快.在Windows下,先需要自行安装Git程序,网址git-scm ...

  6. elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样

    elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...

  7. 011-对象——interface接口说明与使用方式实例

    <?php /** interface接口说明与使用方式实例 * * 接口里面的方法全是抽象方法,没有实体的方法.这样的类我们就叫做接口.定义的时候用Interface定义.实现接口时用impl ...

  8. C#-foreach与yield

    (转自:http://www.jb51.net/article/34627.htm) 1. foreach语句 C#编译器会把foreach语句转换为IEnumerable接口的方法和属性. fore ...

  9. flask_sqlalchemy + sqlite 的一系列使用方法

    如何使用在官网上有详细记录 :http://flask-sqlalchemy.pocoo.org/2.3/ 作为项目笔记,简单阐述使用方法: 1.创建flask_sqlalchemy基于sqlite的 ...

  10. Python编码错误的解决办法SyntaxError: Non-ASCII character '\xe5' in file

    [现象] 在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* [原因 ...