《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)

news/2025/2/13 14:12:59/文章来源:https://www.cnblogs.com/du-hong/p/18382246

 1.简介

通过前边两篇的学习,想必大家已经对iframe有了一定的认识和了解,是不是感觉和Python语言中的差不了多少,大同小异,最多就是不同开发语言的一些语法差异。今天这一篇主要是对iframe做一个总结,主要从iframe的操作(输入框、点击等等)和定位两个方面进行总结。

2.iframe是什么?

iframe 简单来说就是一个 html 嵌套了另外一个 html。在页面元素上最简单的识别方法,就是看你需要定位的元素外层有没有iframe的标签名称。

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

3.iframe定位

定位iframe 对象,总的来说有三种方法

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

page 对象还有2个跟frame 相关的方法

 page.frames(); //获取page对象全部iframes,包含page本身的frame对象page.mainFrame();  //获取page的main_frame (page对象本身也是一个frame对象)

4.iframe的层级结构

官网上写了个示例,可以快速查看iframe的层级结构,如下图所示:

仿照官方的示例,宏哥分别来查看一下QQ邮箱和163邮箱的frame的层级结构。

4.1QQ邮箱的frame层级结构

4.1.1代码设计

4.1.2参考代码
package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Frame;
import com.microsoft.playwright.FrameLocator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)** 2024年8月31日*/
public class Test_frame {static void dumpFrameTree(Frame frame, String indent) {System.out.println(indent + frame.url());for (Frame child : frame.childFrames()) {dumpFrameTree(child, indent + "  ");}}public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.创建contextBrowserContext context = browser.newContext();//创建pagePage page = context.newPage();//3.浏览器打开网站page.navigate("https://mail.qq.com");System.out.println(page.title());dumpFrameTree(page.mainFrame(), "");System.out.println("Test Pass");//关闭page
          page.close();//关闭browser
          browser.close();}}
}
4.1.3运行代码

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

从控制台的输出结果可以看出:QQ邮箱主页面(主页面其实也可以看成一个iframe 对象)下有3个iframe(但是宏哥在Python系列里:其中最后一个iframe下又嵌套了一层iframe。而这里却没有,是因为宏哥没有登录QQ,证实了在Python的猜测)。

4.2 163邮箱的frame 层级结构

4.2.1代码设计

4.2.2参考代码
package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Frame;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)** 2024年8月31日*/
public class Test_frame {static void dumpFrameTree(Frame frame, String indent) {System.out.println(indent + frame.url());for (Frame child : frame.childFrames()) {dumpFrameTree(child, indent + "  ");}}public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.创建contextBrowserContext context = browser.newContext();//创建pagePage page = context.newPage();//3.浏览器打开网站page.navigate("https://mail.163.com");System.out.println(page.title());dumpFrameTree(page.mainFrame(), "");System.out.println("Test Pass");//关闭page
          page.close();//关闭browser
          browser.close();}}
}
4.2.3运行代码

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

从控制台的输出结果可以看出:163邮箱主页面(主页面其实也可以看成一个iframe 对象)下有2个iframe。

5.获取page对象的frame对象

获取page对象的frame用到了以下3个基本方法

// 获取page对象本身的 frame 对象
page.mainFrame();
// 获取page对象全部frames 包含page本身的frame对象
page.frames();
// 获取frame下的全部子 frame 对象
frame.childFrames();

宏哥这里以163邮箱举例说明。

5.1代码设计

5.2参考代码

package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)** 2024年8月31日*/
public class Test_frame {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.创建contextBrowserContext context = browser.newContext();//创建pagePage page = context.newPage();//3.浏览器打开网站page.navigate("https://mail.163.com");System.out.println("'获取page对象本身的frame对象:"+page.mainFrame());System.out.println("'获取page对象全部frames 包含page本身的frame对象:"+page.frames());System.out.println("'获取page对象子frame:"+page.mainFrame().childFrames());System.out.println("Test Pass");//关闭page
          page.close();//关闭browser
          browser.close();}}
}

5.3运行代码

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

6.page.frame() 的使用

page.frame() 和 page.frameLocator() 使用差异

page.frameLocator(); //返回的对象只能用locator() 方法定位元素然后click()等操作元素

page.frame() 返回的对象能直接使用fill() 和 click() 方法

page.frame(); //方法可以使用frame的name属性或url属性定位到frame对象

6.1name属性定位iframe

定位iframe的name属性可以是iframe元素的name 或id属性。name 属性不能模糊匹配,只能绝对匹配字符串。

Frame frame = page.frame("frame-name");
6.1.1使用name属性定位示例

a.宏哥偶然发现一个在线的免费的demo网址:https://sahitest.com/demo 很好用,今天就使用它来讲解定位frame。如下图所示:

b.参考代码,如下:

package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Frame;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)** 2024年8月31日*/
public class Test_frame {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.创建contextBrowserContext context = browser.newContext();//创建pagePage page = context.newPage();//3.浏览器打开网站page.navigate("https://sahitest.com/demo/framesTest.htm");//4.name属性定位Frame frame = page.frame("top");System.out.println(frame);System.out.println("Test Pass");//关闭page
          page.close();//关闭browser
          browser.close();}}
}

c.运行代码控制台输出,如下图所示:

6.1.2使用id属性定位

iframe元素没有name属性,有id属性,也可以用来定位的。

a.宏哥这里还用之前的html页面,进行演示。如下图所示:

b.参考代码,如下:

package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Frame;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)** 2024年8月31日*/
public class Test_frame {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.创建contextBrowserContext context = browser.newContext();//创建pagePage page = context.newPage();//3.浏览器打开网站page.navigate("file:///E:/Desktop/test/iframe/index.html");//4.id属性定位Frame frame = page.frame("frameA");System.out.println(frame);System.out.println("Test Pass");//关闭page
          page.close();//关闭browser
          browser.close();}}
}

c.运行代码控制台输出,如下图所示:

6.2url属性定位iframe

url属性的值,就是我们看到页面上的src属性,可以支持模糊匹配。

Frame frame = page.frameByUrl(Pattern.compile(".*domain.*");

a.宏哥偶然发现一个在线的免费的demo网址:https://sahitest.com/demo 很好用,今天就使用它来讲解定位frame。如下图所示:

b.参考代码,如下:

package com.bjhg.playwright;import java.util.regex.Pattern;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Frame;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)* * 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)** 2024年8月31日*/
public class Test_frame {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium浏览器,# 浏览器配置,设置以GUI模式启动Chrome浏览器(要查看浏览器UI,在启动浏览器时传递 headless=false 标志。您还可以使用 slowMo 来减慢执行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.创建contextBrowserContext context = browser.newContext();//创建pagePage page = context.newPage();//3.浏览器打开网站page.navigate("file:///E:/Desktop/test/iframe/index.html");//4.url定位Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*");Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*"));System.out.println(frame);System.out.println("Test Pass");//关闭page
          page.close();//关闭browser
          browser.close();}}
}

c.运行代码控制台输出,如下图所示:

7.page.frameLocator(selector) 

这个前边已经详细介绍过了,宏哥就是在这里总结一下,具体使用方法可以查看前边的iframe文章。

7.1基本语法

page.frameLocator(selector);

7.2使用示例

1.使用示例,可以直接定位到frame对象,继续定位元素操作

# 直接定位输入
page.frameLocator('[name="top"]').locator("#username").fill('北京-宏哥')
page.frameLocator('[name="top"]').locator("#password").fill('123456')

2.或者先定位到iframe对象,再通过frame对象操作,只需要定位到frame 对象,后面的元素定位操作都基本一样了。

# frame 对象操作
frame = page.frameLocator('[name="top"]');
frame.locator("#username").fill('北京-宏哥');
frame.locator("#password").fill('123456');

3.也可以通过先定位外层的元素,再定位到frame对象,使用基本语法

page.locator(selector).frameLocator(selector)

8.小结

今天主要是对前边的iframe的相关知识做了一个总结以便更好地使用和学习。  好了,时间不早了,关于标签操作宏哥就今天就分享到这里。感谢你耐心地阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/883208.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌地图案例|利用 Google 地图平台提供美味又环保的餐食

Frichti是法国食品配送初创公司,提供健康美味实惠餐食,并注重环保。利用Google地图和大数据工具优化配送和减少浪费,实现30分钟内送达,提升顾客满意度和回头率。Frichti 的使命是在 30 分钟内送达健康、美味、实惠的餐食,并已筹集了 4600 多万美元的资金。其环保理念包括尽…

P3919 【模板】可持久化线段树 1(可持久化数组)(主席树)

这道题要注意空间不能开太小,还有我第一次是build函数忘写return了,我很奇怪,结构体数组开小后,有一个报错和tle,不知道tle是怎么来的#include<iostream> #include<set> #include<map> #include<algorithm> #include<vector> #include<c…

集装箱码头堆场计划智能优化系统

经纬恒润研发的堆场计划智能优化系统,以既有的码头操作系统为基础,建立与码头操作系统的数据接口,读取堆场结构、堆存状态、靠港船舶等信息,针对卸船、装船、集港、疏港等作业场景,围绕港口关注的箱区平衡、规避作业冲突、降低翻倒率、降低作业成本等核心指标,综合考虑各…

uniapp插件uni-upgrade-center-app升级在vue3中报错

记录使用npx @dcloudio/uvm@latest更新uniapp cli版本vite-plugin-uni报错的问题 在uniapp的vue3中,引入升级路径后提示:pnpm i @dcloudio/uni-uts-v1@3.0.0-3061420221215001 -D;用vscode终端安装后打包过程中一直提示cli升级,升级后安装对应的uts依赖包,真机模拟报错,提…

009 自定义事件组件交互

自定义事件可以在组件中反向传递数据,PROP可以将数据从父组件传递到子组件,那么反向如何操作呢,就可以利用自定义事件实现$emit<template><h3>单文件组件</h3><button @click="sendHandle">发送数据</button></teplate><s…

文本编辑器bowpad修改文件编码

bowpad下方有显示当前编码,此处为codepage 1252在【工具栏 - 其他】处可修改编码,如图“载入为” - 以xx编码重新打开本文件 “转换到” - 将当前文件转换为xx编码支持的编码挺多的

分享一款免费的微信群活码、QQ群活码平台、短链平台-畅联活码

今天发现了一款免费的微信群活码、QQ群活码平台、短链平台-畅联活码,在这里分享给大家。平台网址是ewm.kzrcw.com,只需要简单注册后既可以使用了。操作简单。平台源码已经公开,下载地址http://www.80cxy.com/Blog/ResourceView?arId=202502131143553051Oa499Z。 1、什么是微…

80N10-ASEMI高速风筒专用MOS管80N10

80N10-ASEMI高速风筒专用MOS管80N10编辑:ll 80N10-ASEMI高速风筒专用MOS管80N10 型号:80N10 品牌:ASEMI 封装:TO-252 批号:最新 最大漏源电流:80A 漏源击穿电压:100V RDS(ON)Max:9.5mΩ 引脚数量:3 芯片个数: 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:…

离线安装docker对应的docker-compose包

1、找到docker对应的docker-compose包,我的docker版本是26.1,对应的docker-compose版本为v2.27.12、到官网下载docker-compose的离线包 下载地址:https://github.com/docker/compose/releases3、下载好离线包,把离线包放在指定目录下就不需要配置环境变量 `mv docker-compo…

用网络流建模解决最大密度子图问题

在图论中,子图是由原图的一部分节点和这些节点之间的边构成的图。图的密度通常是指图中边的数量与节点的数量之比。形式化地,对于一个图 $ H = (V, E) $,其密度定义为: \[\text{密度}(H) = \frac{|E|}{|V|} \]其中,$ |E| $ 表示图 $ H $ 中的边的数量,$ |V| $ 是图 $ H $…

设置snipaste自启动

右键图标 ——》 首选项 ——》开机自启动 参考——https://blog.csdn.net/weixin_45428910/article/details/127798513

PostgreSQL认证是什么,值得考吗

PostgreSQL认证是一种PG数据库能力认证,是对一个人在PostgreSQL方面的知识积累和技能实操的考核,判断此人是否能够胜任PostgreSQL相关工作的一种考核。 由于数据库行业是对技术要求非常高的一种产品,所以在使用之前需要对使用者有一定的要求,PostgreSQL认证就是其中一种方式…