selenium playwright e to e test

Playwright 入門

張庭瑋 Gary Chang 2023/12/08 10:19:57
3101

簡介

 

說到瀏覽器自動化,大家第一個通常想到的會是Selenium吧?Playwright 也是一個用於網頁測試的自動化測試工具,在開始介紹Playwright之前,本篇著重在快速上手,希望讀者們看完之後可以立刻套用在自己想用的情境上


從零開始

系統需求:Node.js
https://nodejs.org/en

 

建立一個專屬資料夾

mkdir playwright-tests

cd playwright-tests

 

初始化

npm init -y

安裝

npm i -D playwright

安裝playwright 專用瀏覽器

npx playwright install

 

以上便完成初始設定了,接著建立一個簡單的測試

測試情境:

打開google,進到gmail,搜尋tpi相關的信件,截圖後登出

 

先上腳本 (in JavaScript)

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto('https://google.com');

  // Click on the 'Gmail' link
  await page.click('text=Gmail');

  // Wait for navigation to complete
  await page.waitForLoadState();

  await page.click('text=Sign in')

  // Here you can add steps to fill in the login form
  await page.fill('input[type="email"]', '你的帳號@tpisoftware.com');
  // Add logic for password entry and submission here
  await page.getByRole('button' , { name: '下一步'}).click();
  await page.getByLabel('輸入您的密碼').fill('你信箱的密碼');
  await page.getByRole('button' , {name: '下一步'}).first().click();
  await page.getByPlaceholder('在郵件中搜尋').fill('tpi');
  await page.getByPlaceholder('在郵件中搜尋').press('Enter');
  await page.screenshot({ path: '想要放截圖的路徑/screenshot.png' });
  await page.getByLabel('Google 帳戶: 預設會是你的中英文名稱\n(帳號@tpisoftware.com)').click();
  await page.frameLocator('iframe[name="account"]').getByRole('link', { name: '登出' }).click();


  
  // Close the browser
  await browser.close();
})();

 

 

關鍵步驟說明:

 

導入 playwright 函式庫

const { chromium } = require('playwright');

 

非同步設定

(async () => {

    // 執行步驟在這

})();

 

啟動Playwright,打開瀏覽器,這邊用的是Chromium

const browser = await chromium.launch({ headless: false });

 

開新分頁

const page = await browser.newPage();

 

後面的步驟比較直觀,這邊就不展開說明。

若要對網頁元素進行操作,例如特定按鈕、文字輸入

Playwright 裡面有個專門的術語叫:Locators

 

常見的有以下

 

GetByRole()

GetByText()

GetByLabel()

GetByPlacholder()

GetByAltText()

GetByTitle()

 

 

說明到這邊,如果讀者有按照腳本執行,應該會發現這個情況:

 

“怎麼沒有截到我想要的畫面啊?”

 

 

網頁自動化工具很常碰到這個情況,通常這類型的處理方式有兩種:

一、 設定等待時間

二、 等待特定元素出現/結束*

 

這兩個方法都可以解決問題,但是第一個做法較不彈性(但很有效),雖然在這個範例中Gmail已經相當成熟,但專案開發的過程載入時間不一定相同,設定太長的時間會失去自動化的本意,所以建議採用二的方式。

 

如何快速找到我們要的元素呢?

 

Selenium網頁版一樣,Playwright也有提供專屬的錄製工具Playwright Inspector,用滑鼠就可以快速找到需要的元素

 


在專案資料夾裡面開啟終端輸入:

PWDEBUG=1 node google_test.js

 

 

會出現視窗如下

 

點擊綠色執行,然後到截圖完成後的步驟,按暫停

再把滑鼠移到測試瀏覽器上,就可以看到滑鼠位置底下的locators

 

“這個信件是在我執行搜尋後才出現的,就用它吧!“

那可不行,因為 [新人自我介紹] 並不會每次都出現在第一頁

 

仔細看,這個按鈕是在 搜尋 > Loading 之後會出現

 

而且他並沒有特殊標籤,所以就決定用他了!

 

在截圖的指令前面加上:

  const nextPage = page.locator('div:nth-child(3) > .a5D');
  await nextPage.waitFor();

 

鏘鏘 這樣就成功截到我們想要的內容啦

 

 

小結:

Playwright 還有許多實用的指令以及功能可以使用,請參考他們的文件

 

 

*特定元素的消失:這邊因為gmail跑得太快所以我找不到那個元素的位置,對專案熟悉的話,可以放個等待spanner消失的指令,這會是最佳做法之一

張庭瑋 Gary Chang