python+playwright自动化测试(八):iframe切换、多窗口切换
目录
浏览器上下文context对象常用操作
设置默认导航时间
iframe切换
窗口切换
浏览器上下文context对象常用操作
context.pages :获取context所有page对象
context.new_page():生成一个新的page对象
context.add_cookies():将cookie添加到此浏览器上下文所在的所有页面中。
context.clear_cookies():清除context的cookie
context.grant_permissions():浏览器上下文的指定权限授权。
context.clear_permissions():清除授权。context.close():关闭context
设置默认导航时间
page.set_default_navigation_timeout(2000)
设置后对以下方法生效:
- `page.go_back()`
- `page.go_forward()`
- `page.goto()`
- `page.reload()`
- `page.set_content()`
- `page.expect_navigation()`
- `page.wait_for_url()`
iframe切换
在处理新的窗口、弹窗,iframe时,playwright处理方式比较简单,而selenium处理iframe比较麻烦。page.frame() 支持通过frame标签的name和url定位。
print(page.frames) # 获取frames对象,返回一个列表
方法1:
frame_one = page.frame(name='xxx')
frame_one.locator('#pw').fill('123456')
方法2:
直接定位到frame后,再定位到上面的元素,在元素基础上进行操作。
password = page.frame_locator('.frame').locator('#password-input')
password.fill('123456')
窗口切换
每个窗口页面都有独立的title和URL,所以根据这两个属性找到对应页面进行窗口激活(切换)。
写一个切换窗口的方法:
def switch_to_page(context, title=None, url=None):
for item_page in context.pages:
if title:
if title in item_page.title():
item_page.bring_to_front() # 激活选项卡
return item_page
else:
print(f"未找到对应的title{title}窗口")
if url:
if url in item_page.url:
item_page.bring_to_front() # 激活选项卡
return item_page
else:
print(f"未找到对应的url{url}窗口")
return context.pages[0]
def documentManage(playwright: Playwright, url):
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto(url, timeout=50000)
page.set_viewport_size({'width': 1920, 'height': 1080})
windows = page.locator('xpath=//div[@class]//a').all()[200:210:2] # 因为定位到上千个对象,这里挑选几个测试
for w in windows:
w.click() # 点击打开新的窗口
# for con in context.pages:
# print(con.title(), con.url) # 测试打印出每个窗口的title和URL
page_new = switch_to_page(context, url='https://www.aigc.cn/') # 切换到指定窗口
# print(page_new.title(), page_new.url) # 打印切换后的窗口title和URL
assert page_new.url == 'https://www.aigc.cn/' # 断言是否切换正确
page.wait_for_timeout(5000)
context.close()
browser.close()
with sync_playwright() as p:
documentManage(p, 'https://www.aigc.cn/')