Selenium框架切换-----Selenium快速入门(七)
上一篇说了窗口的切换,本篇说说框架的切换。
切换框架:是指切换html中的iframe标签元素或者frame标签元素,注意,并不包括frameset
以下是常用的方法:
| 方法 | 说明 |
| WebDriver switchTo().frame(int index) | 通过索引切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException |
| WebDriver switchTo().frame(String nameOrId) | 通过框架的name或者id切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException |
| WebDriver switchTo().frame(WebElement frameElement) | 通过元素定位切换到该框架。若元素不稳定,则抛出StaleElementReferenceException,若框架不存在,则抛出NoSuchFrameException |
| WebDriver switchTo().parentFrame() | 切换到父级框架,如果当前框架是最顶级,则不会切换。 |
| WebDriver switchTo().defaultContent() | 返回到最顶级的主文档,官方还说了一种可能,就是返回第一个框架,但我暂时未找到这个例子。 |
我们在html目录中增加四个html,分别为frame.html,frame1.html,frame2.html,frameset.html,代码如下
frame.html
<html>
<head>
<meta >
<title></title>
</head>
<body>
<div>
主页文本框:<input type="text" id="text1" value="" />
</div>
<div>
<iframe src="frame1.html" id="frame1" name="frame1">
<p>您的浏览器不支持 iframe 标签。</p>
</iframe>
</div>
<div>
<iframe src="frame2.html" id="frame2" name="frame2">
<p>您的浏览器不支持 iframe 标签。</p>
</iframe>
</div> </body>
</html>
frame1.html
<!DOCTYPE html>
<html>
<head>
<meta >
<title></title>
</head>
<body>
<p>frame1文本框:<input id="text1" type="text" /></p>
</body>
</html>
frame2.html
<!DOCTYPE html>
<html>
<head>
<meta >
<title></title>
</head>
<body> <p>frame2文本框:<input id="text1" type="text" /></p>
</body>
</html>
frameset.html
<!DOCTYPE html>
<html>
<head>
<meta>
<title>窗口切换</title>
</head>
<frameset rows="*,*" ,border="0" scrolling="no">
<frame src="frame1.html" name="frame1" />
<frame src="frame2.html" name="frame2" /> </frameset> </html>
以上的代码都很简单,都是常见的两种框架,iframe和frameset,建立四个html后,我们的项目结构是这样的

我们先来测试下iframe,下面这段代码的效果是,按次序切换到框架2,框架1,主框架,并且切换的时候,找到框架中的文本框,输入文本
需要注意的时,每次切换完,下次切换到其他框架时,都需要先切换到最顶端的主文档,即先调用switchTo().defaultContent(),否则会抛出异常。
//得到WebDriver
WebDriver driver=DriverHelper.CreateChromeDriver(); //为何此处刷新该页,因为发现第一次加载时,并不确定能载入iframe的内容,刷新后,基本都能载入,后面将会讲到Selenium的“等待”
driver.get("D:\\WorkSpace\\SeleniumTest\\html\\frame.html");
Thread.sleep(1000);
driver.get("D:\\WorkSpace\\SeleniumTest\\html\\frame.html");
Thread.sleep(1000); //切换到框架2,找到文本框,输入“frame2”,首次运行,焦点默认在主文档
driver.switchTo().frame(1);
WebElement textFrame2=driver.findElement(By.id("text1"));
textFrame2.sendKeys("frame2"); Thread.sleep(1000); //切换到框架1,找到文本框狂,输入“frame1”
//需要先切换到最顶端文档,否则会抛出异常,找不到该框架
driver.switchTo().defaultContent();
driver.switchTo().frame();
WebElement textFrame1=driver.findElement(By.id("text1"));
textFrame1.sendKeys("frame1"); Thread.sleep(1000); //切换回最顶端文档,找到文本框,输入“main”
driver.switchTo().defaultContent();
WebElement textMain=driver.findElement(By.id("text1"));
textMain.sendKeys("main");
对于frameset.html,操作大同小异,大家可自行尝试,此处就不啰嗦。
除了每次切换前,先调用switchTo().defaultContent()外,当第一次访问frame.html时,框架不一定加载成功,这个要引起我们的注意,实际上,这种情况经常出现,后面将会讲到如何避免这种情况的发生。
最后给出本次代码执行的效果:

Selenium框架切换-----Selenium快速入门(七)的更多相关文章
- 实体框架(Entity Framework)快速入门--实例篇
在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...
- Selenium with Python 002 - 快速入门
一.简单实例演示 1.创建 python_org_search.py: #!/usr/bin/env python from selenium import webdriver from seleni ...
- Selenium窗口切换-----Selenium快速入门(六)
有时候,我们打开多个窗口,进行多窗口操作,那么窗口间该如何切换呢? 切换的方法有两个,一个是通过窗口标题来验证,另一个是通过窗口特定的内容来验证,这两个方法都要求得到的标题或内容是唯一的. 用到的相关 ...
- Keras深度学习框架安装及快速入门
1.下载安装Keras 如果你是安装的Anaconda组合套件,可以直接在Prompt上执行安装命令:pip install keras 注意:最下面为Successfully...表示安装成功! 2 ...
- uni-app跨平台框架介绍和快速入门
前言: 首先今天主要介绍的是一个多平台的前端框架uni-app,关于多平台的前端框架网上有很多成熟的解决方案比如说Taro,React Native,Flutter等这些都是一些非常优秀的前端跨平台的 ...
- Quartz.NET开源作业调度框架系列(一):快速入门step by step
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- Quartz.NET开源作业调度框架系列(一):快速入门step by step-转
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- 实体框架(Entity Framework)快速入门
实体 框架 (Entity Framework )简介 实体框架Entity Framework 是 ADO .NET 中的一组支持 开发 面向数据的软件应用程序的技术.是微软的一个ORM框架. OR ...
- Python中定时任务框架APScheduler的快速入门指南
前言 大家应该都知道在编程语言中,定时任务是常用的一种调度形式,在Python中也涌现了非常多的调度模块,本文将简要介绍APScheduler的基本使用方法. 一.APScheduler介绍 APSc ...
随机推荐
- sorl 6.6.0 定时更新索引
solr 定时更新索引 – solr 6.6.0 – dataimport.scheduler 这里先重点说下,定时更新引用的org.apache.solr.handler.dataimport.sc ...
- mysql迁移之巨大数据量快速迁移方案
mysql迁移之巨大数据量快速迁移方案-增量备份及恢复 --chenjianwen 一.前言: 当mysql库的大小达到几十个G或者上百G,迁移起来是一件非常费事的事情,业务中断,导出导入耗费大量的时 ...
- python写exploit采集器
前言: 根据天文地理与风水学,我掐指一算的看到了一篇不错的文章,文章里面写到整理exploit 我顿时心理想写一个exploit采集器,那么说时迟那时快.就开始写了 代码: 思路:http://exp ...
- 记录在Python2.7 x64 bit 下 PyQt5.8的编译过程
由于工作需要使用python下面的Qt库.PyQt现在只提供针对Python3.X系列的PyQt,所有需要自己手动编译.防止忘记,特意写下随笔记录备忘. 工 作 环境:Python版本:Python ...
- msxml3.dll 执行页内操作时的错误
msxml3.dll 执行页内操作时的错误 regsvr32 msxml3.dll报错
- js 实现 一张图片的上传
.js进行图片预览 使用input标签来选择图片,使用FileReader读取图片并转成base64编码,然后发送给服务器. <html> <body> <img id= ...
- node.js中的匿名函数, 回调函数和嵌套函数
定义一个函数相信大家已经很熟悉了, 在javascript里的函数也是非常重要的, 使用率非常高, 有几种函数不是很好理解 一, 匿名函数 var remove = function(num1) { ...
- http://classworlds.codehaus.org/apiusage.html
API Usage The Java API can be used to create new realms and connect realms together through importat ...
- mybatis与hibernate不同(重要)
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象 ...
- sort_contours_xld算子的几种排序方式研究
算子sort_contours_xld算子有5种排序方式,即: 'upper_left': The position is determined by the upper left corner of ...