《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)

简介: 【5月更文挑战第6天】本文介绍了如何使用Selenium处理含有iframe的网页。作者首先解释了iframe是什么,即HTML中的一个框架,用于在一个页面中嵌入另一个页面。接着,通过一个实战例子展示了在QQ邮箱登录页面中,由于输入框存在于iframe内,导致直接定位元素失败。作者提供了三种方法来处理这种情况:1)通过id或name属性切换到iframe;2)使用webElement对象切换;3)通过索引切换。最后,给出了相应的Java代码示例,并提醒读者根据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();//定位帐号密码登录并点击



每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问):


Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

相关文章
|
27天前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
93 5
|
30天前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
27天前
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
146 5
|
1月前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
|
4天前
|
Web App开发 设计模式 JavaScript
自动化测试之美:如何利用Selenium实现Web应用的高效测试
【10月更文挑战第29天】在软件开发的世界中,测试是确保产品质量的关键步骤。本文将带你了解如何使用Selenium这一强大的自动化测试工具,提高Web应用测试的效率和准确性。通过实际案例,我们将探索Selenium的核心功能及其在现代软件开发中的应用,旨在帮助读者掌握自动化测试的精髓,从而提升软件测试工作的整体效能。
|
29天前
|
Web App开发 缓存 Linux
高效Selenium测试技巧:轻松控制已开启的浏览器
【10月更文挑战第13天】在进行Selenium测试时,通常会启动新浏览器实例,但有时需要控制已开启的浏览器,以节省时间并更真实地模拟用户行为。这可通过设置Chrome为可远程控制并使用`Remote WebDriver`连接实现。需在启动Chrome时添加`--remote-debugging-port`参数,并通过Python脚本中的`webdriver.Remote`连接至指定端口。此外,还可利用会话ID(Session ID)重新连接浏览器,提高测试灵活性。需要注意浏览器版本兼容性及元素定位稳定性等问题,确保测试准确性和一致性。
205 1
|
1月前
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
|
2月前
|
Web App开发 JavaScript Java
自动化测试的利剑:Selenium WebDriver入门与实践
【9月更文挑战第21天】在软件开发的海洋中,自动化测试犹如一艘船,帮助开发者们快速航行至质量保证的彼岸。本文将作为你的罗盘,指引你了解和掌握Selenium WebDriver这一强大的自动化测试工具。通过深入浅出的方式,我们将探索Selenium WebDriver的基本概念、安装过程以及编写简单测试脚本的方法。无论你是刚接触自动化测试的新手,还是希望提升测试技能的开发者,这篇文章都将为你提供有价值的指导。
|
2月前
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
45 3
|
2月前
|
Web App开发 Linux Python
linux上安装selenium环境及测试
该文章提供了在Linux CentOS上安装Selenium环境、Chrome浏览器及Chromedriver的详细步骤,并演示了如何以无头模式进行测试。
151 0