经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外篇 - 北京-宏哥
来源:cnblogs  作者:北京-宏哥  时间:2023/8/29 13:12:34  对本文有异议

1.简介

通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。

2.iframe定位

2.1动态id属性如何定位

有时候,我们可能看到的iframe 的id不是固定的,是动态的一个id, 每次刷新,它的值都不一样(一般前面一部分是固定的),而且它的刚好又没有name属性。例如:宏哥前边讲解的163邮箱的iframe的id就是动态的。如下图所示:

像上图所示的这种动态的id,如何定位了,宏哥在这里讲解两种比较常用的方法,当然了可能有比宏哥更好的方法,欢迎留言讨论。

2.2.1第一种方法

可以用css的正则匹配元素属性

语法

描述

$('[name^="value"]')

匹配 name 以 value 开头的元素

$('[name$="end"]')

匹配 name 以 end 结尾的元素

$('[class*="text"]')

匹配class属性包含text的元素

 参考代码:

  1. # css 正则匹配属性
  2. frame = page.frame_locator('[id^="x-URS-iframe"]')
  3. print(frame)
  4. frame.locator('#username').fill('北京-宏哥')
2.2.2第二种方法

使用xpath的contains 包含属性。参考代码:

  1. # xpath的contains 包含属性
  2. frame = page.frame_locator('//*[contains(@id, "x-URS-iframe")]')
  3. print(frame)
  4. frame.locator('#username').fill('北京-宏哥')

2.2两层iframe如何定位

两层iframe,顾名思义是:iframe下嵌套另外一个iframe。解决办法没什么技巧,一层一层定位即可。多层也是类似的方法。例如:宏哥前边讲解的QQ邮箱的iframe就有个2层的iframe。如下图所示:

  1. #一层一层定位定位frame
  2. frame = page.frame_locator('[class="QQMailSdkTool_login_loginBox_qq_iframe"]').frame_locator("#ptlogin_iframe")
  3. #点击密码登录
  4. frame.locator("#switcher_plogin").click()
  5. frame.locator('#u').fill('北京-宏哥')
  6. frame.locator('#p').fill("123456")
  7. frame.locator('#login_button').click()

3.监听事件

iframe的事件可以通过page对象直接监听到。如下图所示:

3.1代码设计

其它的下载事件,文件上传监听方法都类似一样。

3.2参考代码

  1. # coding=utf-8??
  2.  
  3. # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
  4.  
  5. # 2.注释:包括记录创建时间,创建人,项目名称。
  6. '''
  7. Created on 2023-08-13
  8. @author: 北京-宏哥 QQ交流群:705269076
  9. 公众号:北京宏哥
  10. Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-13-playwright操作iframe
  11. '''
  12.  
  13. # 3.导入模块
  14. from playwright.sync_api import sync_playwright
  15. def handler(dialog):
  16. print("监听dialog 事件")
  17. print(dialog.message)
  18. # dialog.accept()
  19. with sync_playwright() as p:
  20. browser = p.chromium.launch(headless=False)
  21. page = browser.new_page()
  22. page.goto("C:/Users/DELL/Desktop/test/iframe/index.html")
  23. page.on('dialog', handler)
  24. # 一层一层定位
  25. frame = page.frame_locator('#frameA')
  26. frame.locator('#alert').click()
  27. #page.pause()
  28. browser.close()

3.3运行代码

1.运行代码,右键Run'Test',控制台输出,如下图所示:

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

4.执行js脚本

4.1在page对象执行js脚本

使用page.evaluate(js代码)方法可以直接在page对象上执行JavasScript 代码。

4.1.1代码设计

4.1.2参考代码
  1. # coding=utf-8??
  2.  
  3. # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
  4.  
  5. # 2.注释:包括记录创建时间,创建人,项目名称。
  6. '''
  7. Created on 2023-08-13
  8. @author: 北京-宏哥 QQ交流群:705269076
  9. 公众号:北京宏哥
  10. Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-13-playwright操作iframe
  11. '''
  12.  
  13. # 3.导入模块
  14. from playwright.sync_api import sync_playwright
  15. def handler(dialog):
  16. print("监听dialog 事件")
  17. print(dialog.message)
  18. # dialog.accept()
  19. with sync_playwright() as p:
  20. browser = p.chromium.launch(headless=False)
  21. page = browser.new_page()
  22. page.goto("https://sahitest.com/")
  23. page.on("dialog", handler)
  24. # 执行JavaScript
  25. page.evaluate("alert('hello world')")
  26. #page.pause()
  27. browser.close()
4.1.3运行代码

1.运行代码,右键Run'Test',控制台输出,如下图所示:

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

4.2在iframe上执行js脚本

在iframe上执行JavaScript代码,需在iframe对象上执行。例如:在iframe的input中输入“北京-宏哥”,如下图所示:

4.2.1代码设计

4.2.2参考代码
  1. # coding=utf-8??
  2.  
  3. # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
  4.  
  5. # 2.注释:包括记录创建时间,创建人,项目名称。
  6. '''
  7. Created on 2023-08-13
  8. @author: 北京-宏哥 QQ交流群:705269076
  9. 公众号:北京宏哥
  10. Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-13-playwright操作iframe
  11. '''
  12.  
  13. # 3.导入模块
  14. from playwright.sync_api import sync_playwright
  15. with sync_playwright() as p:
  16. browser = p.chromium.launch(headless=False)
  17. page = browser.new_page()
  18. page.goto("C:/Users/DELL/Desktop/test/iframe/index.html")
  19. iframe = page.frame(name='frameA')
  20. # 执行js 给输入框输入内容
  21. js = "document.getElementById('iframeinput').value='北京-宏哥';"
  22. iframe.evaluate(js)
  23. page.pause()
  24. browser.close()
4.2.3运行代码

1.运行代码,右键Run'Test',控制台输出,如下图所示:

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

5.小结

 今天主要讲解和分享了一下iframe在一些特殊情况下如何定位,以及iframe的监听事件和执行js脚本。好了,时间不早了,今天就分享到这里,感谢您耐心的阅读!!!

原文链接:https://www.cnblogs.com/du-hong/p/17616504.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号