官方文档
简单描述
页面上可以有很多 frame 框架,PlayWright 提供了 frame_locator 和 frame API 供用户使用。
示例
PlayWright 提供了 main_frame 方法属性返回 当前页面的主框架。
一、 frame_locator
frame_locator() 和 其他方法大致一样,传入定位的表达式。返回一个 FrameLocator 对象。以下代码请注意是 那个 FrameLocator 对象调用的
def test_access_frame_with_frame_locator(self):
"""
测试更加深处的 frame
:return:
"""
self.page.goto("https://sahitest.com/demo/framesTest.htm")
frame1 = self.page.frame_locator("//frame[@src='index.htm']").first
frame1.locator("xpath=//a[text()='Frames Test']").click()
self.page.screenshot(path='./第一个frame.png')
frame2 = frame1.frame_locator("//frame[@src='index.htm']").last
frame2.locator("xpath=//a[text()='Link Test']").click()
self.page.screenshot(path='./第二个frame.png')
frame3 = frame1.frame_locator("//frame[@src='index.htm']").first
frame3.locator("xpath=//a[text()='Table Test']").click()
self.page.screenshot(path='./第三个frame.png')
with open('page.html', 'w') as fp:
fp.write(self.page.content())
main_frame = self.page.main_frame
with open('main_frame.html', 'w') as fp:
fp.write(main_frame.content())
self.page.wait_for_timeout(3000)
二、 frame
frame() 需要传入必备的参数 name 或者 url 参数。返回一个 Frame对象。
1. 只操作一个frame
def test_access_with_frame(self):
self.page.goto("https://sahitest.com/demo/framesTest.htm")
frame1 = self.page.frame(name='top')
# frame1.locator("xpath=//a[text()='Table Test']").click()
self.page.screenshot(path='./frame1.png')
frame2 = self.page.frame(url='index.htm')
frame2.locator("xpath=//a[text()='Link Test']").click()
self.page.screenshot(path='./frame2.png')
self.page.wait_for_timeout(3000)
2. 操作两个frame
这个就是比上面的多了在 frame1 中定位并操作了元素
def test_access_with_frame(self):
self.page.goto("https://sahitest.com/demo/framesTest.htm")
frame1 = self.page.frame(name='top')
frame1.locator("xpath=//a[text()='Table Test']").click()
self.page.screenshot(path='./frame1.png')
frame2 = self.page.frame(url='index.htm')
frame2.locator("xpath=//a[text()='Link Test']").click()
self.page.screenshot(path='./frame2.png')
self.page.wait_for_timeout(3000)
对比
运行了这两段代码就会疑问?为什么多了个定位和操作方法。这两段代码frame1 和 frame2 的作用效果会不一样。也许是这个PlayWright的特点,待后续查看资料。
所有后面操作还是使用 frame_locator 来进行操作。虽然我写的 frame 接口相关的代码在实际中是很少遇到的。但是还得记录下!