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

  切换框架:是指切换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快速入门(七)的更多相关文章

  1. 实体框架(Entity Framework)快速入门--实例篇

    在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...

  2. Selenium with Python 002 - 快速入门

    一.简单实例演示 1.创建 python_org_search.py: #!/usr/bin/env python from selenium import webdriver from seleni ...

  3. Selenium窗口切换-----Selenium快速入门(六)

    有时候,我们打开多个窗口,进行多窗口操作,那么窗口间该如何切换呢? 切换的方法有两个,一个是通过窗口标题来验证,另一个是通过窗口特定的内容来验证,这两个方法都要求得到的标题或内容是唯一的. 用到的相关 ...

  4. Keras深度学习框架安装及快速入门

    1.下载安装Keras 如果你是安装的Anaconda组合套件,可以直接在Prompt上执行安装命令:pip install keras 注意:最下面为Successfully...表示安装成功! 2 ...

  5. uni-app跨平台框架介绍和快速入门

    前言: 首先今天主要介绍的是一个多平台的前端框架uni-app,关于多平台的前端框架网上有很多成熟的解决方案比如说Taro,React Native,Flutter等这些都是一些非常优秀的前端跨平台的 ...

  6. Quartz.NET开源作业调度框架系列(一):快速入门step by step

    Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...

  7. Quartz.NET开源作业调度框架系列(一):快速入门step by step-转

    Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...

  8. 实体框架(Entity Framework)快速入门

    实体 框架 (Entity Framework )简介 实体框架Entity Framework 是 ADO .NET 中的一组支持 开发 面向数据的软件应用程序的技术.是微软的一个ORM框架. OR ...

  9. Python中定时任务框架APScheduler的快速入门指南

    前言 大家应该都知道在编程语言中,定时任务是常用的一种调度形式,在Python中也涌现了非常多的调度模块,本文将简要介绍APScheduler的基本使用方法. 一.APScheduler介绍 APSc ...

随机推荐

  1. [失败]SystemTap和火焰图(Flame Graph)

    本文参考http://blog.51cto.com/xuclv/1184517 SystemTap简介: SystemTap provides free software (GPL) infrastr ...

  2. [Python] String strip() Method

    Description The method strip() returns a copy of the string in which all chars have been stripped fr ...

  3. leetcode807

    class Solution { public: int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) { ...

  4. div高度自适应的问题

    对象height:100%并不能直接产生效果,是因为跟其父对象有关. #center{height:100%;} 上面的css样式是无效的,不会产生任何效果. 需要改写:   html,body{ m ...

  5. Guide to installing 3rd party JARs

    Although rarely, but sometimes you will have 3rd party JARs that you need to put in your local repos ...

  6. sdm 使用阿里云域名申请 Let’s Encrypt 通配符 域名证书

    安装acme 进入 套件中心 点击安装 Git Server 之后进入SSh会使用git命令 方法1--------------------------------------- 获取代码 git c ...

  7. centos禁止 You have new mail in /var/spool/mail/root提示

    在/etc/profile 增加unset MAILCHECK

  8. BashProfile

    [BashProfile] ~/.bash_profile. alias ll='ls -l -G -a' alias gp='grep --colour -R'

  9. HTTP请求出现405状态码method not allowed的解决办法

    httppost请求目标网站出现405状态码, 原因为 Apache.Nginx.IIS等绝大多数web服务器,都不允许静态文件响应POST请求所以将post请求改为get请求即可

  10. 【poj2411】Mondriaan's Dream 状态压缩dp

    AC传送门:http://vjudge.net/problem/POJ-2411 [题目大意] 有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? [题解] 对于 ...