【playwright】新一代自动化测试神器playwright+python系列课程12_playwright_frame中元素定位

Playwright frame中元素定位

网页中经常嵌套frame框架,在网页中标签为iframe或frame的元素就是frame框架
如图
在这里插入图片描述

或者
在这里插入图片描述

在frame框架中的元素时不能直接定位的,selenium处理frame,需要切换到frame中,然后再切换出来,操作比较麻烦,那么playwright对于frame的操作会不会更加简单呢?

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

iframe定位

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

示例如下:

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

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

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

一个DOM中有多个frame:
多个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()

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

匹配第一个

frame_locator().first

匹配最后一个

frame_locator().last

使用index索引

frame_locator().nth(index)

获取页面上的所有frame

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

frame = page.frame(name="frame-name")
frame = page.frame(url=r".*domain.*")

page.frame 和 page.frame_locator 使用差异:

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

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

# '''
# author: 测试-老姜   交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''


from playwright.sync_api import Playwright, sync_playwright, expect

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("http://127.0.0.1/")
    page.get_by_role("link", name="开源版").click()
    page.locator("#account").click()
    page.locator("#account").fill("admin")
    page.locator("input[name=\"password\"]").click()
    page.locator("input[name=\"password\"]").fill("Deshifuzhi01")
    page.get_by_role("button", name="登录").click()
    page.locator("a").filter(has_text=re.compile(r"^测试$")).click()
    page.frame_locator("iframe[name=\"app-qa\"]").get_by_role("link", name="Bug").click()
    page.frame_locator("iframe[name=\"app-qa\"]").get_by_role("link", name=" 提Bug").click()
    page.frame_locator("iframe[name=\"app-qa\"]").get_by_role("cell", name="影响版本 创建发布  所有 *").locator("div").nth(2).click()
    page.frame_locator("iframe[name=\"app-qa\"]").get_by_title("主干").click()
    page.frame_locator("iframe[name=\"app-qa\"]").locator("input[name=\"title\"]").click()
    page.frame_locator("iframe[name=\"app-qa\"]").locator("input[name=\"title\"]").fill("weet")
    page.frame_locator("iframe[name=\"app-qa\"]").get_by_role("button", name="保存", exact=True).click()

    # ---------------------
    context.close()
    browser.close()


with sync_playwright() as playwright:
    run(playwright)

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

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值