软件测试|web自动化测试神器playwright(五)

简介: 软件测试|web自动化测试神器playwright(五)

前言

在web自动化测试中,frame是我们绕不开的一个东西,也是我们很头疼的东西,selenium处理frame,需要切换到frame中,然后再切换出来,操作比较麻烦,那么playwright对于frame的操作会不会更加简单呢?

答案是肯定的,playwright不需要切换frame,直接定位元素即可。下面我们来介绍一下playwright的frame处理。

iframe定位

要处理frame,我们需要先定位frame,在playwright中,我们可以使用page.frame_locator()或locator.frame_locator()方法创建 FrameLocator 捕获足该 iframe 中检索和定位元素。

示例如下:

locator = page.frame_locator("my-frame").get_by_text("Submit")
locator.click()

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

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

# 一个DOM中有多个frame:
page.frame_locator('.result-frame').get_by_role('button').click()

# 多个frame中,取第一个,即可正常生效:
page.frame_locator('.result-frame').first.get_by_role('button').click()

在带有 id 的 iframe 中定位带有文本“提交”的元素my-frame,例如,我们可以这样写定位表达式,代码如下:

locator = frame.frame_locator("#my-iframe").get_by_text("Submit")
locator.click()

注:很多时候id是动态变化的,每一次打开id都不一样,我们可以通过xpath的contains来进行匹配,例如网易163邮箱的登录界面。

在这里插入图片描述

由于iframe 元素 id 属性是动态可变的id="x-URS-iframe1677824735142.1565" 可以使用xpath的contains 模糊匹配,代码如下:

from playwright.sync_api import sync_playwright


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, slow_mo=1000)
    page = browser.new_page()
    page.goto("https://mail.163.com/")

  
    frame = page.frame_locator('//iframe[contains(@id, "x-URS-iframe")]')
    frame.locator('[name="email"]').fill('theshy')
    frame.locator('[name="password"]').fill("play123456789")
    frame.locator('#dologin').click()

    page.wait_for_timeout(5000)
    browser.close()

类似CSS定位,匹配到多个结果时,我们可以使用first,last,nth()定位到指定的frame。示例如下:

# 匹配第一个
frame_locator().first

# 匹配最后一个
frame_locator().last

# 使用index索引
frame_locator().nth(index)

获取页面上的所有frame

以163邮箱的登录页面为例,我们获取全部的frame,代码如下:

from playwright.sync_api import sync_playwright


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, slow_mo=1000)
    page = browser.new_page()
    page.goto("https://mail.163.com/")
    print(page.frames)
    for f in page.frames:
        print(f)

    page.wait_for_timeout(5000)
    browser.close()

运行结果如下:

[<Frame name= url='https://mail.163.com/'>, <Frame name=frameforlogin url='about:blank'>, <Frame name=frameJS6 url='about:blank'>, <Frame name=x-URS-iframe1677825858563.064 url='https://dl.reg.163.com/webzj/v1.0.1/pub/index_dl2_new.html?cd=%2F%2Fmimg.127.net%2Fp%2Ffreemail%2Findex%2Funified%2Fstatic%2F2023%2F%2Fcss%2F&cf=urs.163.73244e9a.css&MGID=1677825858563.064&wdaId=&pkid=CvViHzl&product=mail163'>]
<Frame name= url='https://mail.163.com/'>
<Frame name=frameforlogin url='about:blank'>
<Frame name=frameJS6 url='about:blank'>
<Frame name=x-URS-iframe1677825858563.064 url='https://dl.reg.163.com/webzj/v1.0.1/pub/index_dl2_new.html?cd=%2F%2Fmimg.127.net%2Fp%2Ffreemail%2Findex%2Funified%2Fstatic%2F2023%2F%2Fcss%2F&cf=urs.163.73244e9a.css&MGID=1677825858563.064&wdaId=&pkid=CvViHzl&product=mail163'>

frame() 定位方法

playwright提供了一种frame() 定位方法 ,可以根据name属性和url属性匹配。代码如下:

frame = page.frame(name="frame-name")
frame = page.frame(url=r".*domain.*")
# Interact with the frame
frame.fill('#username-input', 'theshy')

page.frame 和 page.frame_locator 使用差异

  • page.frame_locator('') 返回的对象只能用locator() 方法定位元素然后click()等操作元素
  • page.frame() 返回的对象能直接使用fill() 和 click() 方法

总结

本文主要介绍了playwright对于frame的处理,相比selenium,playwright对于frame的处理更加方便快捷,减少了selenium的切换的步骤,这对于提升我们的自动化测试执行效率有很大帮助。

相关文章
|
1月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
122 5
|
18天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
21天前
|
Web App开发 设计模式 JavaScript
自动化测试之美:如何利用Selenium实现Web应用的高效测试
【10月更文挑战第29天】在软件开发的世界中,测试是确保产品质量的关键步骤。本文将带你了解如何使用Selenium这一强大的自动化测试工具,提高Web应用测试的效率和准确性。通过实际案例,我们将探索Selenium的核心功能及其在现代软件开发中的应用,旨在帮助读者掌握自动化测试的精髓,从而提升软件测试工作的整体效能。
21 0
|
1月前
|
安全 Linux Shell
Kali渗透测试:使用Metasploit对Web应用的攻击
Kali渗透测试:使用Metasploit对Web应用的攻击
|
1月前
|
Web App开发 Java 测试技术
一、自动化:web自动化。Selenium 入门指南:从安装到实践
一、自动化:web自动化。Selenium 入门指南:从安装到实践
43 0
|
1月前
|
JavaScript 测试技术 持续交付
使用 GitLab CI/CD 管道自动化部署 Web 应用
【10月更文挑战第2天】使用 GitLab CI/CD 管道自动化部署 Web 应用
45 0
|
1月前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
1月前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
|
1月前
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
|
2月前
|
Web App开发 JavaScript Java
自动化测试的利剑:Selenium WebDriver入门与实践
【9月更文挑战第21天】在软件开发的海洋中,自动化测试犹如一艘船,帮助开发者们快速航行至质量保证的彼岸。本文将作为你的罗盘,指引你了解和掌握Selenium WebDriver这一强大的自动化测试工具。通过深入浅出的方式,我们将探索Selenium WebDriver的基本概念、安装过程以及编写简单测试脚本的方法。无论你是刚接触自动化测试的新手,还是希望提升测试技能的开发者,这篇文章都将为你提供有价值的指导。
下一篇
无影云桌面