Web自動化測試之playwright:pages、popup、dialog和frame處理
阿新 • • 發佈:2021-11-23
本文介紹如何使用playwright來處理新頁面、frame以及對話方塊。
目錄新頁面視窗
獲取瀏覽器上下文產生的新頁面,也就是通過 target="_blank"
連結開啟的新視窗。
with context.expect_page() as new_page_info:
page.click('a[target="_blank"]')
new_page = new_page_info.value
new_page.wait_for_load_state()
點選【立即註冊】會開啟一個新的頁面:
下面程式碼實現開啟百度,點選登入,進入註冊介面
from time import sleep from playwright.sync_api import sync_playwright class TestDemo(): def setup(self): playwright = sync_playwright().start() self.browser = playwright.chromium.launch(headless=False) self.context = self.browser.new_context() self.page = self.context.new_page() def teardown(self): self.browser.close() def test_click(self): self.page.goto("http://www.baidu.com") self.page.click('id=s-top-loginbtn') with self.context.expect_page() as new_page_info: self.page.click('"立即註冊"') # Opens a new tab register_page = new_page_info.value register_page.wait_for_load_state() print(register_page.title()) # 註冊使用者名稱密碼 register_page.fill("id=TANGRAM__PSP_4__userName", "username") register_page.fill("id=TANGRAM__PSP_4__phone", "12345678") register_page.close() sleep(2) # 登入使用者名稱密碼 self.page.fill("id=TANGRAM__PSP_11__userName", "username") self.page.fill("id=TANGRAM__PSP_11__password", "pwd") sleep(2)
playwright不像selenium那樣在有頭模式下可以切換視窗,它預設是無頭模式的,直接對對應的頁面物件進行操作就可以了。
selenium視窗切換參考Selenium switch_to方法
彈框處理
頁面中的彈框(popup)是很常見的,處理方法和開啟新頁面類似:
with page.expect_popup() as popup_info:
page.click("#open")
popup = popup_info.value
popup.wait_for_load_state()
print(popup.title())
對話方塊處理
常見對話方塊包括alert(), confirm(), prompt()等,預設情況下,Playwright會取消對話方塊,可以通過在觸發對話方塊之前註冊一個對話方塊控制代碼:
page.on("dialog", lambda dialog: dialog.accept())
page.click("button")
dialog測試地址:https://sahitest.com/demo/confirmTest.htm
def test_dialog(self):
self.page.goto("https://sahitest.com/demo/confirmTest.htm")
self.page.click('[name="b1"]') # 預設取消對話方塊
# 接受對話方塊
self.page.on("dialog", lambda dialog: dialog.accept())
self.page.click('[name="b1"]')
sleep(5)
frame切換
獲取frame方法如下:
# 通過frame的name屬性
frame = page.frame('frame-login')
# 通過frame的URL
frame = page.frame(url=r'.*domain.*')
# 通過選擇器selector
frame_element_handle = page.query_selector('.frame-class')
frame = frame_element_handle.content_frame()
參考: