《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作--番外篇 (详细教程)
1.简介
通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。
2.iframe定位
2.1动态id属性如何定位
有时候,我们可能看到的iframe 的id不是固定的,是动态的一个id, 每次刷新,它的值都不一样(一般前面一部分是固定的),而且它的刚好又没有name属性。例如:宏哥前边讲解的163邮箱的iframe的id就是动态的。如下图所示:

像上图所示的这种动态的id,如何定位了,宏哥在这里讲解两种比较常用的方法,当然了可能有比宏哥更好的方法,欢迎留言讨论。
2.1.1第一种方法
1.可以用css的正则匹配元素属性,如下表所示:
|
语法 |
描述 |
|
|
匹配 name 以 value 开头的元素 |
|
|
匹配 name 以 end 结尾的元素 |
|
|
匹配class属性包含text的元素 |
2.参考代码:
// css 正则匹配属性
FrameLocator frame = page.frameLocator("[id^='x-URS-iframe']");
System.out.println(frame);
frame.locator("[id^='auto-id-']").nth(1).fill("北京-宏哥");
2.1.2第二种方法
使用xpath的contains 包含属性。参考代码:
// xpath的contains 包含属性
FrameLocator frame = page.frameLocator("//*[contains(@id, 'x-URS-iframe')]");
System.out.println(frame);
frame.locator("//*[contains(@id, 'auto-id-')]").nth(1).fill("北京-宏哥");
2.2两层iframe如何定位
1.两层iframe,顾名思义是:iframe下嵌套另外一个iframe。解决办法没什么技巧,一层一层定位即可。多层也是类似的方法。例如:宏哥前边讲解的QQ邮箱的iframe就有个2层的iframe。如下图所示:

2.参考代码:
// 一层一层定位定位frame
FrameLocator frame = page.frameLocator("[class='QQMailSdkTool_login_loginBox_qq_iframe']").frameLocator("#ptlogin_iframe");
//点击密码登录
frame.locator("#switcher_plogin").click();
frame.locator("#u").fill("北京-宏哥");
frame.locator("#p").fill("123456");
frame.locator("#login_button").click();
3.趁热打铁
趁着宏哥讲解完了,大家还有一些记忆,然后宏哥就利用实例演示一下前边介绍的几种frame的定位方法。
3.1css的正则匹配元素属性
以163邮箱为例进行实战如下:
3.1.1代码设计

3.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自动化测试-15- iframe操作-番外篇(详细教程)
*
* 2024年9月11日
*/
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.创建context
BrowserContext context = browser.newContext();
//创建page
Page page = context.newPage(); //3.浏览器打开网站
page.navigate("https://mail.163.com");
//4.url定位Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*");
//Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*"));
// css 正则匹配属性
FrameLocator frame = page.frameLocator("[id^='x-URS-iframe']");
System.out.println(frame);
frame.locator("[id^='auto-id-']").nth(1).fill("北京-宏哥"); System.out.println("Test Pass");
//关闭page
page.close();
//关闭browser
browser.close();
}
}
}
3.1.3运行代码
1.运行代码,右键Run As->Java Application,就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.2xpath的contains 包含属性
以163邮箱为例进行实战如下:
3.2.1代码设计

3.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.FrameLocator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright; /**
* @author 北京-宏哥
*
* @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)
*
* 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作-番外篇(详细教程)
*
* 2024年9月11日
*/
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.创建context
BrowserContext context = browser.newContext();
//创建page
Page page = context.newPage(); //3.浏览器打开网站
page.navigate("https://mail.163.com");
//4.url定位Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*");
//Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*")); // xpath的contains 包含属性
FrameLocator frame = page.frameLocator("//*[contains(@id, 'x-URS-iframe')]");
System.out.println(frame);
frame.locator("//*[contains(@id, 'auto-id-')]").nth(1).fill("北京-宏哥"); System.out.println("Test Pass");
//关闭page
page.close();
//关闭browser
browser.close();
}
}
}
3.2.3运行代码
1.运行代码,右键Run As->Java Application,就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.3两层iframe定位
以QQ邮箱为例进行实战如下:
3.3.1代码设计

3.3.2参考代码
package com.bjhg.playwright; import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.FrameLocator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright; /**
* @author 北京-宏哥
*
* @公众号:北京宏哥(微信搜索,关注宏哥,提前解锁更多测试干货)
*
* 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作-番外篇(详细教程)
*
* 2024年9月11日
*/
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.创建context
BrowserContext context = browser.newContext();
//创建page
Page page = context.newPage(); //3.浏览器打开网站
page.navigate("https://mail.qq.com/");
//4.url定位Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*");
//Frame frame = page.frameByUrl(Pattern.compile(".*iframe.html.*")); // 一层一层定位定位frame
FrameLocator frame = page.frameLocator("[class='QQMailSdkTool_login_loginBox_qq_iframe']").frameLocator("#ptlogin_iframe");
//点击密码登录
frame.locator("#switcher_plogin").click();
frame.locator("#u").fill("北京-宏哥");
frame.locator("#p").fill("123456");
frame.locator("#login_button").click(); System.out.println("Test Pass");
//关闭page
page.close();
//关闭browser
browser.close();
}
}
}
3.3.3运行代码
1.运行代码,右键Run As->Java Application,就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

4.小结
今天主要是对前边的iframe的相关知识做了一个总结以便小伙伴或者童鞋们更好地使用和学习。 前边两种定位宏哥感觉像是模糊匹配到好多个元素,然后利用顺序定位(nth)定位到自己想要的元素,切记序号是从0开始计数的噢! 好了,时间不早了,关于iframe操作宏哥就今天就分享到这里。感谢你耐心地阅读。
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作--番外篇 (详细教程)的更多相关文章
- 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是 ...
- 《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何自动化测试,这一篇宏哥在网上找了一个问卷调查,给小伙伴或童鞋们来演示一下.上 ...
- Java微信公众平台开发【番外篇】(七)--公众平台测试帐号的申请
转自:http://www.cuiyongzhi.com/post/45.html 前面几篇一直都在写一些比较基础接口的使用,在这个过程中一直使用的都是我个人微博认证的一个个人账号,原本准备这篇是写[ ...
- 《手把手教你》系列基础篇之(一)-java+ selenium自动化测试-环境搭建(上)(详细教程)
1.简介 jmeter系列的文章结束,本来想趁热打铁顺别将Jmeter和接口测试介绍一下,但是感觉Jmeter时间太长了怕大家吃腻了,还有一个原因就是许多小伙伴们或者童鞋们私信问宏哥什么时候可以有ja ...
- 《手把手教你》系列基础篇(五)-java+ selenium自动化测试- 创建首个自动化脚本(详细教程)
1.简介 前面几篇宏哥介绍了两种(java和maven)环境搭建和三大浏览器的启动方法,这篇文章宏哥将要介绍第一个自动化测试脚本.前边环境都搭建成功了,浏览器也驱动成功了,那么我们不着急学习其他内容, ...
- 《手把手教你》系列技巧篇(二十)-java+ selenium自动化测试-元素定位大法之终卷(详细教程)
1.简介 这篇文章主要是对前边的文章中的一些总结和拓展.本来是不打算写着一篇的,但是由于前后文章定位元素的时间有点长,怕大家忘记了,就在这里简单做一个总结和拓展. 2.Selenium八种定位方式 S ...
- python自动化测试应用-番外篇--接口测试1
篇1 book-python-auto-test-番外篇--接口测试1 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),至今<安卓a ...
- Monkey源代码分析番外篇之Android注入事件的三种方法比較
原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析 ...
- [uboot] (番外篇)uboot串口&console&stdio设备工作流程 (转)
[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...
- [uboot] (番外篇)uboot 驱动模型(转)重要
[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...
随机推荐
- 第十四届蓝桥杯省赛C++B组--接龙序列
接龙序列 我们称序列中\(a_i\)的首位数字恰好是\(a_{i-1}\)的末尾数字,这样的序列叫做接龙序列,比如12 23 35 57,所有长度为1的整数序列都是接龙序列,现在给定一个长度为\(n\ ...
- uniapp 画布
1.前言 uniapp中的canvas与HTML中的canvas用法并不同,他的使用文档请参考微信小程序画布 2.基本使用 1.准备canvas容器,并为其设置canvas-id和宽高(为了兼容H5, ...
- 高效文件处理:Python pathlib实战指南
在使用Python处理文件路径时,强烈建议使用pathlib. pathlib以面向对象的方式处理文件路径,既避免了很多陷阱,也能使执行许多路径的相关操作变得更容易. 本篇总结了常用的使用pathli ...
- 【并查集+dfs】codeforces 1833 E. Round Dance
题意 输入一个正整数 \(T(1 \leq T \leq 10^4)\),表示接下来输入 \(T\) 组测试用例,对于每一个测试用例: 第一行,输入一个正整数 \(n(2 \leq n \leq 2 ...
- Tauri2.0-Vue3OS桌面端os平台|tauri2+vite6+arco电脑版OS管理系统
自研tauri2.x+vite6+vue3+arco.design客户端os管理系统Tauri2ViteOS. vue3-tauri2-os原创跨平台Tauri2.0+Vite6+Pinia2+Arc ...
- PDF 图书
我找到的深入介绍 PDF 结构的图书主要有 2 本: PDF Explained,这本书比较早,首发于 2011 年11 月 30 日 Developing with PDF,首发于 2013年10月 ...
- Qt编写地图综合应用30-世界地图
一.前言 世界地图也属于区域地图的一种,最开始做项目的时候只有国内的地图需求,后面有个客户他们的产品是面向国际市场,所以在大屏展示的时候,必须展示一张世界地图,所有箭头动态流向中国,当然这些都要离线使 ...
- Qt编写安防视频监控系统22-摄像机搜索
一.前言 摄像机搜索模块是后面新增加的,这个模块很有必要,一开始做视频监控系统的时候,那时候还没有研究出来一套纯Qt底层通信的onvif类,也就前几个月搞出来了,支持搜索设备信息和云台控制,所以马上加 ...
- Qt编写的项目作品16-Onvif搜索和云台控制工具
一.功能特点 广播搜索设备,支持IPC和NVR,依次返回. 可选择不同的网卡IP进行对应网段设备的搜索. 依次获取Onvif地址.Media地址.Profile文件.Rtsp地址. 可对指定的Prof ...
- Qt编写地图综合应用12-路线查询
一.前言 路线查询的功能只有在线地图才有,因为这个路线规划需要经常更新的,这个数据同步需要大量的人力物力去统计,所以这玩意必须放在服务器端,就算是类似于手机端一样的放在本地离线,也需要隔一段时间更新的 ...