上一篇说了窗口的切换,本篇说说框架的切换。

  切换框架:是指切换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时,框架不一定加载成功,这个要引起我们的注意,实际上,这种情况经常出现,后面将会讲到如何避免这种情况的发生。

  最后给出本次代码执行的效果:

  

  

最新文章

  1. go channel
  2. 【转】oracle in和exists、not in和not exists原理和性能探究
  3. Chkdsk scan needed on volume
  4. [NetTopologySuite](1)线面相交
  5. oracle知识点
  6. 给Sublime Text 2安装CTags插件
  7. 【转】不同VLAN之间相互通信及VTP、STP、EtherChannel概念
  8. gitweb安装
  9. rdlc报表
  10. 06MySQL数据库入门
  11. LeetCode_Binary Tree Inorder Traversal
  12. windows完全支持C++11的轻量级编译器(官网MinGW和非官方的MinGW-builds)
  13. 重构HTML改善web应用设计
  14. java 的序列化
  15. 详解Bootstrap 定义按钮的样式(CSS)
  16. Linux下安装php开发框架yaf
  17. WCF学习——构建第二个WCF应用程序(六)
  18. [Phonegap+Sencha Touch] 移动开发26 Android下的sencha touch程序,转屏时,Ext.Viewport不能触发orientationchange事件的解决的方法
  19. Java系统监控(淘汰sigar)
  20. Android四大组件之一Service介绍-android学习之旅(十二)

热门文章

  1. 「小程序JAVA实战」小程序的分享和下载功能(69)
  2. centos7 二进制安装MySQL5.7.22
  3. window.btoa()方法;使字符编码成base64的形式
  4. 【转】mac os、linux及unix之间的关系
  5. 安装nvidia driver
  6. react-navigation 3.x版本的安装以及react-native-gesture-handler配置
  7. torque
  8. DART: a fast and accurate RNA-seq mapper with a partitioning strategy DART:使用分区策略的快速准确的RNA-seq映射器
  9. About Game Controllers
  10. openstack网络管理命令