openCasePage.mjs

/**
 * 為單一案例開新的瀏覽器context與頁面,並掛上對話框(alert/confirm/prompt)處理器
 *
 * 每案例fresh context,避免cookie、localStorage與快取跨案例殘留;contextOptions透傳給browser.newContext
 * (viewport、locale、timezoneId等確定性參數依專案給定,不給即沿用Playwright預設)
 *
 * @param {Browser} browser 輸入Playwright之Browser
 * @param {Object} [opt={}] 輸入設定物件,預設{}
 * @param {Object} [opt.contextOptions={}] 輸入browser.newContext之參數物件,預設{}
 * @param {String|Function|null} [opt.onDialog='accept'] 輸入對話框處理方式,'accept'自動接受、'dismiss'自動取消、函數則自行處理(傳入dialog)、null不掛,預設'accept'
 * @returns {Promise} 回傳Promise,resolve回傳Playwright之Page
 * @example
 *
 * import openCasePage from 'w-package-tools-e2e/src/openCasePage.mjs'
 *
 * let page = await openCasePage(browser)
 * let page2 = await openCasePage(browser, { contextOptions: { viewport: { width: 1440, height: 900 } } })
 *
 */
async function openCasePage(browser, opt = {}) {
    let { contextOptions = {}, onDialog = 'accept' } = opt
    let context = await browser.newContext(contextOptions)
    let page = await context.newPage()
    if (onDialog === 'accept') {
        page.on('dialog', async (dialog) => {
            await dialog.accept()
        })
    }
    else if (onDialog === 'dismiss') {
        page.on('dialog', async (dialog) => {
            await dialog.dismiss()
        })
    }
    else if (typeof onDialog === 'function') {
        page.on('dialog', onDialog)
    }
    return page
}


export default openCasePage