Playwright 获取toast信息
前言
在使用app的时候,经常会遇到一些提示信息,出现之后一闪而过,不需要手动操作就会自动关闭,不留下一点点痕迹,这种提示信息就是toast信息。现在在web系统中这种toast信息也应用的越来越多,那么我们在做web自动化的时候就可能需要获取这些toast信息,例如用于断言。那么我们就需要定位toast信息所在的元素,虽然toast信息所在的元素看起来也是个提示窗口,但是它不是标准的alert,和Dialog不一样,它永远不会获得焦点,无法被点击,所以不能用 dialog 事件监听。那么这个toast我们这边如何使用playwright进行定位并获取toast信息呢?今天老姜就介绍一下。
这种toast信息能够流行主要是可以提升用户的体验,Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,让用户可以看到。所以Toast显示的时间有限,Toast会根据用户设置的显示时间后自动消失。在Web中和在Android差不多一样。toast属于一种轻量级的反馈,常常以小弹框的形式出现,一般出现1到3秒会自动消失,可以出现在屏幕上中下任意位置,由于出现的时间非常短,这类元素的html源码还没打开呢可能就消失了,这种情况下怎么定位呢?这里我们可以使用浏览器的调试暂停功能。
F12后点开Source,触发toast信息弹出后,立刻点暂停按钮,这个时候toast信息就不会消失了。

这时候页面处于调试暂停状态了,再回到检测元素,鼠标指上去,就能看到元素属性了

我们以安居客的登录功能为例看一下toast信息如何获取。
实践代码:
# '''
# author: 测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
from playwright.sync_api import Playwright, sync_playwright, expect
import re
import pytest
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://login.anjuke.com/login/form?history=aHR0cHM6Ly94YS5hbmp1a2UuY29tLz9waT1QWi1iYWlkdS1wYy1hbGwtYmlhb3Rp")
frame = page.frame_locator('#iframeLoginIfm')
frame.locator('#phoneIpt').fill('18612345678')
frame.locator('#smsIpt').fill('12234')
frame.locator('[id="checkagree"]').click()
frame.locator('[id="smsSubmitBtn"]').click()
t = frame.locator('.toast').inner_text() # 获取toast信息
print(t)
page.wait_for_timeout(10000)
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)

获取toast信息,并使用assert断言
# '''
# author: 测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
from playwright.sync_api import Playwright, sync_playwright, expect
import re
import pytest
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://login.anjuke.com/login/form?history=aHR0cHM6Ly94YS5hbmp1a2UuY29tLz9waT1QWi1iYWlkdS1wYy1hbGwtYmlhb3Rp")
frame = page.frame_locator('#iframeLoginIfm')
frame.locator('#phoneIpt').fill('18612345678')
frame.locator('#smsIpt').fill('12234')
frame.locator('[id="checkagree"]').click()
frame.locator('[id="smsSubmitBtn"]').click()
t = frame.locator('.toast').inner_text() # 获取toast信息
assert t == '请获取验证码' # assert断言提示信息
page.wait_for_timeout(10000)
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
断言消息框内容,也可以直接用expect 断言
# '''
# author: 测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
from playwright.sync_api import Playwright, sync_playwright, expect
import re
import pytest
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://login.anjuke.com/login/form?history=aHR0cHM6Ly94YS5hbmp1a2UuY29tLz9waT1QWi1iYWlkdS1wYy1hbGwtYmlhb3Rp")
frame = page.frame_locator('#iframeLoginIfm')
frame.locator('#phoneIpt').fill('18612345678')
frame.locator('#smsIpt').fill('12234')
frame.locator('[id="checkagree"]').click()
frame.locator('[id="smsSubmitBtn"]').click()
#直接断言toast信息
expect(frame.locator('.toast')).to_have_text('请获取验证码')
page.wait_for_timeout(10000)
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
还可以使用is_visible() 用if判断元素是否出现
# '''
# author: 测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
from playwright.sync_api import Playwright, sync_playwright, expect
import re
import pytest
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://login.anjuke.com/login/form?history=aHR0cHM6Ly94YS5hbmp1a2UuY29tLz9waT1QWi1iYWlkdS1wYy1hbGwtYmlhb3Rp")
frame = page.frame_locator('#iframeLoginIfm')
frame.locator('#phoneIpt').fill('18612345678')
frame.locator('#smsIpt').fill('12234')
frame.locator('[id="checkagree"]').click()
frame.locator('[id="smsSubmitBtn"]').click()
if frame.locator('.toast').is_visible(): # 判断toast信息所在元素是否出现
t = frame.locator('.toast').inner_text() # 获取toast信息
print(f'toast信息是:{t}')
page.wait_for_timeout(10000)
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)

1168

被折叠的 条评论
为什么被折叠?



