天天看點

軟體測試|web自動化測試神器playwright(五)

作者:測試者穆勒
軟體測試|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郵箱的登入界面。

軟體測試|web自動化測試神器playwright(五)

由于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("https://mail.163.com/")

  
    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("https://mail.163.com/")
    print(page.frames)
    for f in page.frames:
        print(f)

    page.wait_for_timeout(5000)
    browser.close()
           

運作結果如下:

[<Frame name= url='https://mail.163.com/'>, <Frame name=frameforlogin url='about:blank'>, <Frame name=frameJS6 url='about:blank'>, <Frame name=x-URS-iframe1677825858563.064 url='https://dl.reg.163.com/webzj/v1.0.1/pub/index_dl2_new.html?cd=%2F%2Fmimg.127.net%2Fp%2Ffreemail%2Findex%2Funified%2Fstatic%2F2023%2F%2Fcss%2F&cf=urs.163.73244e9a.css&MGID=1677825858563.064&wdaId=&pkid=CvViHzl&product=mail163'>]
<Frame name= url='https://mail.163.com/'>
<Frame name=frameforlogin url='about:blank'>
<Frame name=frameJS6 url='about:blank'>
<Frame name=x-URS-iframe1677825858563.064 url='https://dl.reg.163.com/webzj/v1.0.1/pub/index_dl2_new.html?cd=%2F%2Fmimg.127.net%2Fp%2Ffreemail%2Findex%2Funified%2Fstatic%2F2023%2F%2Fcss%2F&cf=urs.163.73244e9a.css&MGID=1677825858563.064&wdaId=&pkid=CvViHzl&product=mail163'>
           

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的切換的步驟,這對于提升我們的自動化測試執行效率有很大幫助。