1.简介

原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了。但是还是有小伙伴或者童鞋们私下问这个问题,那么宏哥就单独写一篇关于iframe网页处理的文章。iframe 是web自动化里面一个比较头疼的测试场景,在Selenium中处理 iframe 需要切换来切换去非常麻烦。但是在playwright中,让其变得非常简单,我们在使用中无需切换iframe,直接定位元素即可。

2.iframe是什么

iframe就是我们常用的iframe标签:<iframe>。iframe标签是框架的一种形式,也比较常用到,iframe一般用来包含别的页面,例如我们可以在我们自己的网站页面加载别人网站或者本站其他页面的内容。iframe标签的最大作用就是让页面变得美观。iframe标签的用法有很多,主要区别在于对iframe标签定义的形式不同,例如定义iframe的长宽高。简单的一句话概括就是:iframe 就是HTML 中,用于网页嵌套网页的。 一个网页可以嵌套到另一个网页中,可以嵌套很多层。和俄罗斯套娃差不多吧。

3.iframe语法

page.frame_locator()

  1. locator = page.frame_locator("frame").get_by_text("登录");

说明:使用frame_locator() 定位到iframe上,再在上面使用locator方法定位元素。

可以使用page.frame_locator()或locator.frame_locator()方法创建 FrameLocator 捕获足该 iframe 中检索和定位元素。

使用示例一:

  1. Locator locator = page.frameLocator("#my-frame").getByText("Submit");
  2. locator.click();

使用frame_locator() 定位到iframe上,然后继续在上面使用locator方法定位元素

iframe 定位器是严格的。这意味着如果有多个元素与给定的选择器匹配,则对 iframe 定位器的所有操作都会抛出异常。

  1. // Throws if there are several frames in DOM:
  2. page.frame_locator(".result-frame").getByRole(AriaRole.BUTTON).click();
  3.  
  4. // Works because we explicitly tell locator to pick the first frame:
  5. page.frame_locator(".result-frame").first().getByRole(AriaRole.BUTTON).click();

将 Locator 转换为 FrameLocator

如果你有一个指向 的 Locator 对象,则可以使用 Locator.contentFrame() 将其转换为 FrameLocator。iframe

将 FrameLocator 转换为 Locator

如果你有一个 FrameLocator 对象,则可以使用 FrameLocator.owner() 将其转换为指向同一对象的 Locator。

4.FrameLocator定位

匹配第一个,将 locator 返回到第一个匹配的frame。

  1. FrameLocator.first();

匹配最后一个

  1. FrameLocator.last();

使用index索引

  1. FrameLocator.nth(index);

获取全部iframes

  1. page.frames

5.frame() 定位

一个页面可以附加一个或多个Frame对象。每个页面都有一个主框架,并且假设页面级交互(如单击)在主框架中操作。
页面可以附加带有iframe HTML标签的额外框架。可以访问这些帧以在帧内进行交互。

  1. // Locate element inside frame
  2. Locator username = page.frameLocator(".frame-class").getByLabel("User Name");
  3. username.fill("John");

5.1frame对象

可以使用Page.frame()API访问框架对象:

根据name属性和url属性匹配

  1. // Get frame using the frame"s name attribute
  2. Frame frame = page.frame("frame-login");
  3.  
  4. // Get frame using frame"s URL
  5. Frame frame = page.frameByUrl(Pattern.compile(".*domain.*"));
  6.  
  7. // Interact with the frame
  8. frame.fill("#username-input", "John");

6.page.frame 和 page.frameLocator 区别

page.frameLocator() 返回的对象需要用locator() 方法定位元素,再操作元素
page.frame() 返回的对象可直接使用fill() 、 click() 方法。

7.项目实战

网上找了半天也没有找到这样的例子,以前百度、163的邮箱是这种。最近几年技术升级了,已经不是这种了。不找了索性宏哥自己在本地做一个这样的小demo给小伙伴或者童鞋们来演示一下。

7.1被测的HTML代码

1.准备测试练习index.html,如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>北京-宏哥|iframeTestDemo</title>
  5. <style type="text/css">
  6.  
  7. .button1 {
  8. background-color: #f44336;
  9. border: none;
  10. color: white;
  11. padding: 15px 32px;
  12. text-align: center;
  13. text-decoration: none;
  14. display: inline-block;
  15. font-size: 28px;
  16. margin-bottom: 100px;
  17. text-decoration:none;
  18. color: white;
  19. }
  20. #myAnchor
  21. {
  22. text-decoration:none;
  23. color: white;
  24. }
  25. </style>
  26. </head>
  27. <body style="text-align:center">
  28. <div id="wrapper" style="position: relative;top: 100px;left:0px;">
  29. <button class="button1"><a id="myAnchor" href="https://www.cnblogs.com/du-hong/">北京-宏哥</a></button></br>
  30. <div id="id1">I am a index page's div!</div>
  31. <input type="text" id="maininput" />
  32. <br/>
  33. <iframe id="frameA" frameborder="0" scrolling="no" style="left:857px;position:absolute;" src="iframe.html"></iframe>
  34. </div>
  35. </body>
  36. </html>

2.准备测试练习iframe.html,如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>I am a iframe!</title>
  5. </head>
  6. <body>
  7. <div id="div1">I am iframes div!</div>
  8. <input id="iframeinput"></input>
  9. </body>
  10. </html>

3.页面效果,如下图所示:

8.牛刀小试

8.1代码设计

8.2参考代码

  1. package com.bjhg.playwright;
  2.  
  3. import com.microsoft.playwright.Browser;
  4. import com.microsoft.playwright.BrowserContext;
  5. import com.microsoft.playwright.BrowserType;
  6. import com.microsoft.playwright.Locator;
  7. import com.microsoft.playwright.Page;
  8. import com.microsoft.playwright.Playwright;
  9.  
  10. /**
  11. * @author 北京-宏哥
  12. *
  13. * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)
  14. *
  15. * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-12- iframe操作-上篇(详细教程)
  16. *
  17. * 2024年8月31日
  18. */
  19. public class Test_frame {
  20.  
  21. public static void main(String[] args) {
  22. try (Playwright playwright = Playwright.create()) {
  23. //1.使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。
  24. Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));
  25. //2.创建context
  26. BrowserContext context = browser.newContext();
  27. //创建page
  28. Page page = context.newPage();
  29.  
  30. //3.浏览器打开百度
  31. page.navigate("file:///E:/Desktop/test/iframe/index.html");
  32. System.out.println(page.title());
  33.  
  34. // 操作非 iframe上的元素
  35. page.locator("[id='maininput']").fill("I am a index page's div!");
  36. // 操作 iframe 上的元素
  37. Locator locator = page.frameLocator("#frameA").locator("[id='iframeinput']");
  38. // xpath 匹配
  39. locator.fill("This is a iframe input!");
  40.  
  41. System.out.println("Test Pass");
  42.  
  43. //关闭page
  44. page.close();
  45. //关闭browser
  46. browser.close();
  47. }
  48. }
  49. }

8.3运行代码

1.运行代码,右键Run As->Java Application,就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作(将对应文字输入输入框)。如下图所示:

9.小结

好了,时间不早了,今天就分享到这里,下一篇宏哥找一个还有iframe的在线网页给小伙伴或者童鞋们实战演示一下。

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-12- iframe操作-上篇(详细教程)的更多相关文章

  1. 《手把手教你》系列技巧篇(五十二)-java+ selenium自动化测试-处理面包屑(详细教程)

    1.简介 面包屑(Breadcrumb),又称面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱特",当汉赛尔和格莱特穿过森林时,不小心迷路了 ...

  2. 《手把手教你》系列技巧篇(六十)-java+ selenium自动化测试 - 截图三剑客 -中篇(详细教程)

    1.简介 前面我们介绍了Selenium中TakeScreenshot类来截图,得到的图片是浏览器窗口内的截图.有时候,只截浏览器窗口内的图是不够的,而且TakeScreenshot截图只针对浏览器的 ...

  3. 《手把手教你》系列技巧篇(六十一)-java+ selenium自动化测试 - 截图三剑客 -下篇(详细教程)

    1.简介 按照计划宏哥今天将介绍java+ selenium自动化测试截图操作实现的第三种截图方法,也就是截图的第三剑客 - 截取某个元素(或者目标区域)的图片.在测试的过程中,有时候不需要截取整个屏 ...

  4. 《手把手教你》系列技巧篇(五十七)-java+ selenium自动化测试-下载文件-下篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  5. 《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)

    1.简介 在实际测试中,我们不仅需要读取Excle,而且有时候还需要读取CSV类的文件.如何去读取CSV的文件,宏哥今天就讲解和分享一下,希望对你能够有所帮助.前面介绍了如何读取excel文件,本篇介 ...

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

    1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...

  7. 《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)

    1.简介 在自动化测试,有些我们的测试数据是放到excel文件中,尤其是在做数据驱动测试的时候,所以需要懂得如何操作获取excel内的内容.由于java不像python那样有直接操作Excle文件的类 ...

  8. Java开发环境安装与配置(干货详细教程)

    Java开发环境安装与配置(干货详细教程)  对于文章中出现的任何错误请大家批评指出,会及时做出修改!  安装JDK JDK是 Java 语言的软件开发工具包要学习 链接Java中国官网https:/ ...

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

    1.简介 经过宏哥长时间的查找,终于找到了一个含有iframe的网页.所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的. ...

  10. 《手把手教你》系列技巧篇(五十三)-java+ selenium自动化测试-上传文件-上篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

随机推荐

  1. Ansible 运维自动化

    Ansible 概述Ansbile是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,列如持续部署,滚动更新.Ansible 适用于管理企业IT基础设施,从具有少数主机的小规模到数 ...

  2. 网站刚上线,就被 DDoS 攻击炸了!

    今天是一个值得纪念的日子,你打开一罐可乐,看着自己刚刚上线的小网站,洋洋得意. 这是你第一次做的网站,上线之后,网站访问量突飞猛进:没过多久,你就拿到了千万的风投,迎娶了女神,走上了人生巅峰... 害 ...

  3. 使用Tesseract进行图片文字识别

    Tesseract介绍 Tesseract 是一个开源的光学字符识别(OCR)引擎,最初由 HP 在 1985 年至 1995 年间开发,后来被 Google 收购并开源.Tesseract 支持多种 ...

  4. 《前端运维》一、Linux基础--11服务

    首先服务的概念,对于linux服务器来说,其中大多数的软件都算是服务,比如nginx.mysql.Jenkins等等.下面我们就来学习一下linux中有关服务的一些内容. 一.服务简介和分类 1.运行 ...

  5. windows下fopen,fclose断电数据丢失解决办法

    #include <io.h> //在fclose之前调用fflush和_commit,可以有效防止断电数据丢失 fflush(file); _commit(fileno(file)); ...

  6. 出现警告信息 Please enter a commit message to explain why this merge is necessary,

    Please enter a commit message to explain why this merge is necessary, # especially if it merges an u ...

  7. 实用干货分享(2) - Docker使用操作指南

    一.Docker安装部署 1. 安装仓库 执行以下命令,安装Docker所需的包.其中yum-utils提供yum-config-manager工具:device-mapper-persistent- ...

  8. 2024年1月Java项目开发指南16:用户自由选择字段查询、是否模糊查询

    我们希望用户可以自己控制是否要模糊查询 用户可以自由的选择字段去查询. 如上图,我在前端页面准备了 多选框:决定是否模糊查询.(True or False) 下拉选择框:决定要查询关键词的所属字段 输 ...

  9. Shell三元表达式

    Shell三元表达式   shell能否实现三元表达式呢?像下面这样: int a = (b == 5) ? c : d; 实现方法: a=$([ "$b" == 5 ] & ...

  10. pygame基础功能总结

    1.导入Pygame模块 (1) 模块并初始化 ① Import pygame ② Pygame.init() (2) 创建窗体 ① Window_size = (800,600)  长宽 ② Scr ...