《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)
1.简介
经过宏哥长时间的查找,终于找到了一个含有iframe的网页。所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的。
2.iframe是什么
iframe就是我们常用的iframe标签:<iframe>。iframe标签是框架的一种形式,也比较常用到,iframe一般用来包含别的页面,例如我们可以在我们自己的网站页面加载别人网站或者本站其他页面的内容。iframe标签的最大作用就是让页面变得美观。iframe标签的用法有很多,主要区别在于对iframe标签定义的形式不同,例如定义iframe的长宽高。简单的一句话概括就是:iframe 就是HTML 中,用于网页嵌套网页的。 一个网页可以嵌套到另一个网页中,可以嵌套很多层。和俄罗斯套娃差不多吧。
3.selenium处理iframe的方法
selenium提供了switch_to.frame(reference)方法来切换frame。reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象。
// 进入 id 叫frameA 的 iframe
dr.switchTo().frame("frameA"); // 回到主窗口
dr.switchTo().defaultContent();
4.项目实战
网上找了半天也没有找到这样的例子,以前12306的日历是这种。最近升级了,已经不是这种了。完了就没有找了,偶然发现QQ邮箱的登录还是iframe这种方式的,所以宏哥就利用这个网页给大家实战演示一下。
4.1被测网址
1.被测网址的地址:https://mail.qq.com/
2.网页如下图(F12可以看到iframe标签):

3.假设宏哥想要在qq邮箱输入框输入内容,输入框的html代码如下:

4.此时宏哥在QQ邮箱输入框输入内容的代码如下:
package lessons; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author 北京-宏哥
*
*《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe-下篇(详解教程)
*
* 2021年11月9日
*/
public class TestQQMail { public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://mail.qq.com/"); Thread.sleep(5000); //By id 定位
WebElement QQMailName = driver.findElement(By.id( "u" ));
QQMailName.sendKeys("test@qq.com"); } }
5.但是运行代码 后报错,如下图所示:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"u"}

6.此时小伙伴或者童鞋们是不是比较郁闷?这个输入框明显是有id属性的啊,并且属性值确实是u啊。。。那么问题在哪呢?其实就是iframe的原因,我们再仔细分析下html代码会发现沿着定位元素让上找会找到罪魁祸首iframe。如下图所示:

7.换句话说也就是我们要定位的元素时在这个 iframe中的,所以需要先切到iframe里边后才可操作。好了原因知道了,按照上一篇宏哥讲解的知识点,很轻松就可以定位到解决问题。
4.2代码设计
1.如果我们要切入的iframe有id或者name属性的话,我们可以直接通过driver.switch_to.frame并且传入要切换的iframe对应的id或者name对应属性值就可以切换到iframe,切换完后便可对我们要操作的元素进行操作。

2.如果要定位的iframe没有id或者那么的话,此时可以通过xpath、css等其他方式定位到iframe然后再进行切入。

3.使用index来区分iframe,index从0开始的。宏哥一直以为只有一个iframe,因此开始代码里写的是0结果是死活定位不到元素,后来查了一遍HTML发现是两个iframe,改成1后,立马定位元素成功!

4.3参考代码
1.传id参数
package lessons; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author 北京-宏哥
*
*《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe-下篇(详解教程)
*
* 2021年11月9日
*/
public class TestQQMail { public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://mail.qq.com/"); Thread.sleep(2000); //WebElement frame = driver.findElement(By.tagName("iframe"));
driver.switchTo().frame("login_frame"); //By id 定位
driver.findElement(By.id( "switcher_plogin" )).click();
Thread.sleep(1000);
WebElement QQMailName = driver.findElement(By.id( "u" ));
QQMailName.sendKeys("test@qq.com");
System.out.println(" 嘿嘿!宏哥,你已经成功定位iframe内的元素啦!");
}
}
2.传selenium的WebElement对象
package lessons; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author 北京-宏哥
*
*《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe-下篇(详解教程)
*
* 2021年11月9日
*/
public class TestQQMail { public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://mail.qq.com/"); Thread.sleep(2000); WebElement frame = driver.findElement(By.cssSelector("#qqLoginCard>iframe"));
driver.switchTo().frame(frame); //By id 定位
driver.findElement(By.id( "switcher_plogin" )).click();
Thread.sleep(1000);
WebElement QQMailName = driver.findElement(By.id( "u" ));
QQMailName.sendKeys("test@qq.com");
System.out.println(" 嘿嘿!宏哥,你已经成功定位iframe内的元素啦!");
}
}
3.传index参数
package lessons; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author 北京-宏哥
*
*《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe-下篇(详解教程)
*
* 2021年11月9日
*/
public class TestQQMail { public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://mail.qq.com/"); Thread.sleep(2000); //WebElement frame = driver.findElement(By.tagName("iframe"));
driver.switchTo().frame(1); //By id 定位
driver.findElement(By.id( "switcher_plogin" )).click();
Thread.sleep(1000);
WebElement QQMailName = driver.findElement(By.id( "u" ));
QQMailName.sendKeys("test@qq.com");
System.out.println(" 嘿嘿!宏哥,你已经成功定位iframe内的元素啦!");
}
}
4.4运行代码
1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:
5.小结
1.在Web UI自动化的测试中,如果一个元素定位不到,那么最大的可能定位的元素属性是在 iframe 框架中,iframe 是 html 中的框架,在 html 中,所谓框架就是可以在同一个浏览器窗口中显示不止一个页面,对不同页面进行嵌套。顺着定位元素往上找,查看是否有<iframe>标签,找到说明要定位此元素,需先切换到此表单,在定位元素。
2.frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。
3.通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:
index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象
4.如果你的电脑登录QQ后,要注意将这一行代码注释去掉,如果没有登录QQ,需要将这一行代码注释掉。因为QQ已经登录,然后登录邮箱默认快捷登录,就会看不到账号密码登录的元素,出现找不到元素的报错。
//driver.findElement(By.id( "switcher_plogin" )).click();//定位帐号密码登录并点击
《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)的更多相关文章
- 《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName.看到ID,NAME这些方法的讲解,小伙伴们和童鞋们应该知道,要做好Web自动化测试,最好是需要了 ...
- 《手把手教你》系列技巧篇(十七)-java+ selenium自动化测试-元素定位大法之By css上卷(详细教程)
1.简介 CSS定位方式和xpath定位方式基本相同,只是CSS定位表达式有其自己的格式.CSS定位方式拥有比xpath定位速度快,且比CSS稳定的特性.下面详细介绍CSS定位方式的使用方法.xpat ...
- 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)
1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...
- 《手把手教你》系列技巧篇(十一)-java+ selenium自动化测试-元素定位大法之By tag name(详细教程)
1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName.看到ID,NAME这些方法的讲解,小伙伴们和童鞋们应该知道,要做好Web自动化测试,最好是需要了 ...
- 《手把手教你》系列技巧篇(七)-java+ selenium自动化测试-宏哥带你全方位吊打Chrome启动过程(详细教程)
1.简介 经过前边几篇文章和宏哥一起的学习,想必你已经知道了如何去查看Selenium相关接口或者方法.一般来说我们绝大多数看到的是已经封装好的接口,在查看接口源码的时候,你可以看到这个接口上边的注释 ...
- 《手把手教你》系列技巧篇(八)-java+ selenium自动化测试-元素定位大法之By id(详细教程)
1.简介 从这篇文章开始,要介绍web自动化核心的内容,也是最困难的部分了,就是:定位元素,并去对定位到的元素进行一系列相关的操作.想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素,如 ...
- 《手把手教你》系列技巧篇(九)-java+ selenium自动化测试-元素定位大法之By name(详细教程)
1.简介 上一篇宏哥已经介绍了通过id来定位元素,今天继续介绍其他剩下的七种定位方法中的通过name来定位元素.本文来介绍Webdriver中元素定位方法之By name,顾名思义,就是我们想要定位的 ...
- 《手把手教你》系列技巧篇(十三)-java+ selenium自动化测试-元素定位大法之By partial link text(详细教程)
1.简介 本文按计划就要开始介绍partial link text,顾名思义是通过链接定位的(官方说法:超链接文本定位).什么是partial link text呢,看到part这个单词我们就可以知道 ...
- 《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...
- 《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)
1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚做跟踪鼠标点击了哪些元素需要标记出来.今天宏哥就在这里把这种测试场景讲解和分享一下. 2.用法 创建一个执行 JS 的对象 ...
随机推荐
- CF618F-Double Knapsack【结论】
正题 题目链接:https://www.luogu.com.cn/problem/CF618F 题目大意 给出大小为\(n\),值域为\([1,n]\)的两个可重集合\(A,B\) 需要你对它们各求出 ...
- Redis之品鉴之旅(六)
持久化 快照的方式(RDB) 文件追加方式(AOF) 快照形式: save和bgsave能快速的备份数据.但是.........., Save命令:将内存数据镜像保存为rdb文件,由于redis是单线 ...
- 分布式、微服务必须配个日志管理系统才优秀,Exceptionless走起~~~
前言 在真实的项目中,不管是功能日志.错误日志还是异常日志,已经是项目的重要组成部分.在原始的单体架构,通常看日志的方式简单粗暴,直接登录到服务器,把日志文件拷贝下来进行分析:而如今分布式.微服务架构 ...
- 【Azure Developer】Azure Automation 自动化账号生成的时候怎么生成连接 与证书 (Connection & Certificate)
Azure Automation :The Azure Automation service provides a highly reliable and scalable workflow exec ...
- 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...
- css如何简单设置文字溢出盒子显示省略号
1.单行文本溢出显示省略号单行文本溢出显示省略号,必须满足三个条件:(1)先强制一行内显示文本white-space:nowrap;(默认 normal自动换行)(2)超出的部分隐藏overflow: ...
- 将DataFrame赋值为可变变量在spark中多次赋值后运行速度减慢的问题
该问题先标记上,之后有空了研究原因. 在var dataframe后将dataframe作为参数输入某方法,将结果重新赋予该dataframe,会导致spark运行显著减慢速度.暂时不知道原因,之后研 ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
- Java序列初始化
1.数组 Java数组可以用元素集合初始化: char[] c=new char[]{'.','.','.','.'}; 而想要用指定数量的相同元素来初始化数组,可以使用Arrays.fill()方法 ...
- 提升使用Linux效率的小操作
提升使用Linux效率的小操作 保存更新? 本文记录了个人在使用Linux时觉得好用的一些快捷方式/功能: 为那种知道了能提高效率,但是的不知道也并没有影响的操作. 历史命令 该操作用于快速查看已使用 ...