应用场景:

在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
 
frame.html
 <html>
<head>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.mincss" rel="stylesheet" />
<script type="text/javascript">$(document).ready(function(){});</script>
</head>
<body>
<div class="row-fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="if" name="nf" src="http://www.baidu.com" width="1600" height="800"></iframe>
</div>
</div>
</body>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
</html>

在上面的html代码中,我通过iframe表单嵌入一个百度页面,用浏览器打开后如图所示:

这时候直接定位页面上的百度输入框一定会报错:找不到元素。因此可以使用switch_to.frame()先找到frame.html中的

 #导包
from selenium import webdriver
from time import sleep
#定义浏览器句柄
driver=webdriver.Chrome()
#打开本地frame.html
url="file:///C:/Users/Charseki/Desktop/Web%E8%87%AA%E5%8A%A8%E5%8C%96/iframe%E5%A4%9A%E8%A1%A8%E5%8D%95%E5%88%87%E6%8D%A2/frame.html"
driver.get(url)
#窗口最大化
driver.maximize_window()
#直接去拿百度输入框元素
#driver.find_element_by_xpath('//input[@id="kw"]')
#发现报错,因为元素在iframe表单里面
#正确的方法:进入到iframe表单,再去获取百度输入框元素
driver.switch_to.frame(driver.find_element_by_xpath('//iframe[contains(@src,"www.baidu.com")]'))
driver.find_element_by_xpath('//input[@id="kw"]').send_keys("可以操作元素了")
#点击“百度一下”按钮
driver.find_element_by_xpath('//input[@id="su"]').click()
sleep(3)
driver.quit()

switch_to.frame()默认可以直接取表单的id或name属性。如果iframe没有可以用的id和name属性,则可以通过下面的方式进行定位。

 #先通过xpath定位到iframe
xf=driver.find_element_by_xpath('//*[@class="if"]')
#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
......
driver.switch_to.parent_frame()

如果完成了在当前表单上的操作,则可以通过switch_to.parent_frame()方法跳出当前一级表单。该方法默认对应于离它最近的switch_to.frame()方法。除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面。

----------------------------------------------------------------------------------------------------------------------------------------------------------------
Talk is cheap,show me the code.

frame/iframe多表单切换的更多相关文章

  1. selenium webdriver——多表单切换与多窗口切换

    多表单切换 >>在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe 表单内嵌页面上的元素无 ...

  2. selenium 多表单切换处理(iframe/frame)

    在web应用中,前台网页的设计一般会用到iframe/frame表单嵌套页面的应用.简单的就是一个页面签嵌套多个HEML/JSP文件.selenium webdriver  只能在同一页面识别定位元素 ...

  3. webdriver--定位一组元素+iframe表单切换

    定位一组元素:find_elements,返回的是list,所以可以用列表的索引对列表里的某个元素操作,也可以用for循环访问list,依次操作各元素 driver.find_elements_by_ ...

  4. Selenium 2自动化测试实战15(多表单切换)

    一.多表单切换 在web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位.这 ...

  5. Selenium 3----定位一组元素+多表单切换+多窗口切换

    定位一组元素 和定位单个元素类似,WebDriver提供了8种用于定位一组元素的方法.定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数. find_e ...

  6. 使用selenium遍历frame中的表单信息 ;

    遍历frame中的表单 : package webDriverPro; import java.util.List; import java.util.regex.Matcher; import ja ...

  7. 遍历frame中的表单:

    遍历frame中的表单: public void table1() { // 查找frame List<WebElement> iframes = driver.findElements( ...

  8. selenium多表单切换以及多窗口切换、警告窗处理

    selenium表单切换 在做UI自动化,有时候要定位的元素属性在页面上明明是唯一的.却怎么也不执行对元素的操作动作,这时候多半是iframe表单在作怪. 切入表单:iddriver.switch_t ...

  9. iframe+form表单提交数据

    <h6>基于iframe+Form表单</h6> <iframe id="iframe" name="ifra" onclick= ...

随机推荐

  1. PAT-B 1003. 我要通过!(20) Java版

    "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&quo ...

  2. Spring04——Spring MVC 全解析

    前文分别介绍了 Spring IOC 与 Spring AOP 的相关知识,本文将为各位大概带来 Spring MVC 的知识点.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 J ...

  3. MySQL逻辑分层介绍

    上一篇文章主要介绍了MySQL在Ubuntu18.04系统上的安装,以及安装过程中可能会遇到的一些问题的解决方案. 在这篇文章里,开始介绍MySQL数据库的逻辑分层.通过本文的介绍,可以大致了解到My ...

  4. 「MoreThanJava」当大学选择了计算机之后应该知道的

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  5. CSRF的几种防御方法的利弊分析

    本文直接从防御方式开始讨论,防御CSRF有4种方法: 使用POST替代GET 检验HTTP Referer 验证码 Token 使用POST替代GET 一些程序员在开发的时候都是用GET.POST通用 ...

  6. 4D

    GIS行业通常将GIS常用的数据产品概括为“4D”,即:DOM(数字正射影像图).DEM(数字高程模型).DLG(数字线划地图).DRG(数字栅格地图).以及复合模式派生数据组成. DOM:数字正射影 ...

  7. linux常用命令(运维用到)

    0.基础命令 pwd 查看当前目录 ls 查看当前目录所有文件夹和文件 mkdir 新建目录 mkdir -p a/b/c 创建多级目录 touch 新建文件 cat 查看文件 clear 清屏 sh ...

  8. Python python 数据类型--集

    # set 集 '''Python还包括集合的数据类型.集合是无序集合,没有重复元素. 基本用途包括成员资格测试和消除重复条目. 集合对象还支持数学运算,如并集,交集,差异和对称差异. ''' nam ...

  9. Cplex教育版申请

    任何人:直接在公众号"毒书 彼记" ,“资源下载” 板块下载: 如果你的学校没有购买cplex软件没那么,你就不可以下载教育版的cplex软件,如过下载免费板,它的功能会有一些限制 ...

  10. docker-compose搭建redis哨兵集群

    头脑风暴 出于学习目的,您可以很轻松地在docker环境下运行redis的单个实例,但是如果您需要在生产环境中运行它,那么必须将Redis部署为HA(High Avaliable)模式. Redis ...