软件测试|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("/")
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("/")
print(page.frames)
for f in page.frames:
print(f)
page.wait_for_timeout(5000)
browser.close()
运行成果如下:
[Frame name= url='']
Frame name= url='/'
Frame name=frameforlogin url='about:blank'
Frame name=frameJS6 url='about:blank'
Frame name=x-URS-iframe1677825858563.064 url=''
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的切换的步调,那关于提拔我们的主动化测试施行效率有很大搀扶帮助。