BrowserContext
BrowserContexts 提供操作多個獨立瀏覽器會話的方法。
如果頁面開啟另一個頁面,例如透過 window.open
呼叫,則彈出視窗將屬於父頁面的瀏覽器上下文。
Playwright 允許使用 Browser.newContext() 方法建立隔離的非持久性瀏覽器上下文。非持久性瀏覽器上下文不會將任何瀏覽資料寫入磁碟。
// Create a new incognito browser context
BrowserContext context = browser.newContext();
// Create a new page inside context.
Page page = context.newPage();
page.navigate("https://example.com");
// Dispose context once it is no longer needed.
context.close();
方法
addCookies
v1.9 之前加入將 Cookie 新增到此瀏覽器上下文中。此上下文中的所有頁面都將安裝這些 Cookie。Cookie 可以透過 BrowserContext.cookies() 取得。
用法
browserContext.addCookies(Arrays.asList(cookieObject1, cookieObject2));
參數
cookies
List<Cookie
>#-
setName
String -
setValue
String -
setUrl
String (可選)url 或 domain / path 為必填。可選。
-
setDomain
String (可選)為了讓 Cookie 也適用於所有子網域,請在網域前加上點,例如:".example.com"。url 或 domain / path 為必填。可選。
-
setPath
String (可選)url 或 domain / path 為必填 可選。
-
setExpires
double (可選)Unix 時間,以秒為單位。可選。
-
setHttpOnly
boolean (可選)可選。
-
setSecure
boolean (可選)可選。
-
setSameSite
enum SameSiteAttribute { STRICT, LAX, NONE }
(可選)可選。
-
回傳
addInitScript
v1.9 之前加入新增一個腳本,該腳本將在以下其中一種情況下評估
- 每當在瀏覽器上下文中建立或導航頁面時。
- 每當在瀏覽器上下文中任何頁面中附加或導航子框架時。在這種情況下,腳本將在新附加框架的上下文中評估。
腳本在文件建立之後但在其任何腳本執行之前評估。這對於修改 JavaScript 環境很有用,例如,為 Math.random
植入種子。
用法
在頁面載入之前覆寫 Math.random
的範例
// preload.js
Math.random = () => 42;
// In your playwright script, assuming the preload.js file is in same directory.
browserContext.addInitScript(Paths.get("preload.js"));
透過 BrowserContext.addInitScript() 和 Page.addInitScript() 安裝的多個腳本的評估順序未定義。
參數
回傳
backgroundPages
加入於:v1.11背景頁面僅在基於 Chromium 的瀏覽器上支援。
上下文中所有現有的背景頁面。
用法
BrowserContext.backgroundPages();
回傳
browser
v1.9 之前加入傳回上下文的瀏覽器實例。如果它是作為持久性上下文啟動的,則傳回 null。
用法
BrowserContext.browser();
回傳
clearCookies
v1.9 之前加入從上下文中移除 Cookie。接受可選的篩選器。
用法
context.clearCookies();
context.clearCookies(new BrowserContext.ClearCookiesOptions().setName("session-id"));
context.clearCookies(new BrowserContext.ClearCookiesOptions().setDomain("my-origin.com"));
context.clearCookies(new BrowserContext.ClearCookiesOptions().setPath("/api/v1"));
context.clearCookies(new BrowserContext.ClearCookiesOptions()
.setName("session-id")
.setDomain("my-origin.com"));
參數
options
BrowserContext.ClearCookiesOptions
(可選)
回傳
clearPermissions
v1.9 之前加入清除瀏覽器上下文的所有權限覆寫。
用法
BrowserContext context = browser.newContext();
context.grantPermissions(Arrays.asList("clipboard-read"));
// do stuff ..
context.clearPermissions();
回傳
close
v1.9 之前加入關閉瀏覽器上下文。屬於瀏覽器上下文的所有頁面都將關閉。
預設瀏覽器上下文無法關閉。
用法
BrowserContext.close();
BrowserContext.close(options);
參數
回傳
cookies
v1.9 之前加入如果未指定 URL,此方法會傳回所有 Cookie。如果指定了 URL,則僅傳回影響這些 URL 的 Cookie。
用法
BrowserContext.cookies();
BrowserContext.cookies(urls);
參數
回傳
exposeBinding
v1.9 之前加入此方法在上下文中每個頁面的每個框架的 window
物件上新增一個名為 name 的函數。呼叫時,該函數會執行 callback 並傳回一個 Promise,該 Promise 解析為 callback 的傳回值。如果 callback 傳回 Promise,則將會等待它完成。
callback 函數的第一個引數包含有關呼叫者的資訊:{ browserContext: BrowserContext, page: Page, frame: Frame }
。
請參閱 Page.exposeBinding() 以取得僅限頁面的版本。
用法
將頁面 URL 公開給上下文中所有頁面的所有框架的範例
import com.microsoft.playwright.*;
public class Example {
public static void main(String[] args) {
try (Playwright playwright = Playwright.create()) {
BrowserType webkit = playwright.webkit();
Browser browser = webkit.launch(new BrowserType.LaunchOptions().setHeadless(false));
BrowserContext context = browser.newContext();
context.exposeBinding("pageURL", (source, args) -> source.page().url());
Page page = context.newPage();
page.setContent("<script>\n" +
" async function onClick() {\n" +
" document.querySelector('div').textContent = await window.pageURL();\n" +
" }\n" +
"</script>\n" +
"<button onclick=\"onClick()\">Click me</button>\n" +
"<div></div>");
page.getByRole(AriaRole.BUTTON).click();
}
}
}
參數
-
window 物件上函數的名稱。
-
callback
BindingCallback
#將在 Playwright 的上下文中呼叫的回呼函數。
-
options
BrowserContext.ExposeBindingOptions
(可選)
回傳
exposeFunction
v1.9 之前加入此方法在上下文中每個頁面的每個框架的 window
物件上新增一個名為 name 的函數。呼叫時,該函數會執行 callback 並傳回一個 Promise,該 Promise 解析為 callback 的傳回值。
如果 callback 傳回 Promise,則將會等待它完成。
請參閱 Page.exposeFunction() 以取得僅限頁面的版本。
用法
將 sha256
函數新增到上下文中所有頁面的範例
import com.microsoft.playwright.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class Example {
public static void main(String[] args) {
try (Playwright playwright = Playwright.create()) {
BrowserType webkit = playwright.webkit();
Browser browser = webkit.launch(new BrowserType.LaunchOptions().setHeadless(false));
BrowserContext context = browser.newContext();
context.exposeFunction("sha256", args -> {
String text = (String) args[0];
MessageDigest crypto;
try {
crypto = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
return null;
}
byte[] token = crypto.digest(text.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(token);
});
Page page = context.newPage();
page.setContent("<script>\n" +
" async function onClick() {\n" +
" document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');\n" +
" }\n" +
"</script>\n" +
"<button onclick=\"onClick()\">Click me</button>\n" +
"<div></div>\n");
page.getByRole(AriaRole.BUTTON).click();
}
}
}
參數
回傳
grantPermissions
v1.9 之前加入授予瀏覽器上下文指定的權限。如果指定,則僅授予給定來源的相應權限。
用法
BrowserContext.grantPermissions(permissions);
BrowserContext.grantPermissions(permissions, options);
參數
-
要授予的權限清單。
危險瀏覽器之間,甚至在同一瀏覽器的不同版本之間,支援的權限也不同。任何權限都可能在更新後停止運作。
以下是一些可能受到某些瀏覽器支援的權限
'accelerometer'
'ambient-light-sensor'
'background-sync'
'camera'
'clipboard-read'
'clipboard-write'
'geolocation'
'gyroscope'
'magnetometer'
'microphone'
'midi-sysex'
(系統專屬 midi)'midi'
'notifications'
'payment-handler'
'storage-access'
-
options
BrowserContext.GrantPermissionsOptions
(可選)-
要授予權限的 來源,例如 "https://example.com"。
-
回傳
newCDPSession
加入於:v1.11CDP 會話僅在基於 Chromium 的瀏覽器上支援。
傳回新建立的會話。
用法
BrowserContext.newCDPSession(page);
參數
回傳
newPage
v1.9 之前加入在瀏覽器上下文中建立新頁面。
用法
BrowserContext.newPage();
回傳
pages
v1.9 之前加入傳回上下文中所有開啟的頁面。
用法
BrowserContext.pages();
回傳
route
v1.9 之前加入路由提供修改瀏覽器上下文中任何頁面發出的網路請求的功能。啟用路由後,每個符合 url 模式的請求都會停滯,除非它繼續、完成或中止。
BrowserContext.route() 不會攔截 Service Worker 攔截的請求。請參閱 此 問題。我們建議在使用請求攔截時停用 Service Worker,方法是將 setServiceWorkers 設定為 'block'
。
用法
中止所有圖片請求的簡易處理常式的範例
BrowserContext context = browser.newContext();
context.route("**/*.{png,jpg,jpeg}", route -> route.abort());
Page page = context.newPage();
page.navigate("https://example.com");
browser.close();
或使用 regex 模式的相同程式碼片段
BrowserContext context = browser.newContext();
context.route(Pattern.compile("(\\.png$)|(\\.jpg$)"), route -> route.abort());
Page page = context.newPage();
page.navigate("https://example.com");
browser.close();
可以檢查請求以決定路由動作。例如,模擬所有包含某些 post 資料的請求,並將所有其他請求保持原樣
context.route("/api/**", route -> {
if (route.request().postData().contains("my-string"))
route.fulfill(new Route.FulfillOptions().setBody("mocked-data"));
else
route.resume();
});
當請求同時符合這兩個處理常式時,頁面路由(使用 Page.route() 設定)優先於瀏覽器上下文路由。
若要移除具有其處理常式的路由,您可以使用 BrowserContext.unroute()。
啟用路由會停用 http 快取。
參數
-
url
String | Pattern | Predicate<String>#在路由時要比對的 glob 模式、regex 模式或謂詞 [URL]。當透過上下文選項提供 setBaseURL 且傳遞的 URL 是路徑時,它會透過
new URL()
建構函式合併。 -
用於路由請求的處理常式函數。
-
options
BrowserContext.RouteOptions
(可選)
回傳
routeFromHAR
加入於:v1.23如果指定,則在此上下文中發出的網路請求將從 HAR 檔案提供。閱讀更多關於 從 HAR 重新播放 的資訊。
Playwright 不會從 HAR 檔案提供 Service Worker 攔截的請求。請參閱 此 問題。我們建議在使用請求攔截時停用 Service Worker,方法是將 setServiceWorkers 設定為 'block'
。
用法
BrowserContext.routeFromHAR(har);
BrowserContext.routeFromHAR(har, options);
參數
-
具有預先錄製網路資料的 HAR 檔案的路徑。如果
path
是相對路徑,則會相對於目前的工作目錄解析它。 -
options
BrowserContext.RouteFromHAROptions
(可選)-
setNotFound
enum HarNotFound { ABORT, FALLBACK }
(可選)#- 如果設定為 'abort',則 HAR 檔案中找不到的任何請求都將中止。
- 如果設定為 'fallback',則會退回到處理常式鏈中的下一個路由處理常式。
預設為中止。
-
如果指定,則使用實際網路資訊更新給定的 HAR,而不是從檔案提供服務。當呼叫 BrowserContext.close() 時,檔案會寫入磁碟。
-
setUpdateContent
enum RouteFromHarUpdateContentPolicy { EMBED, ATTACH }
(可選)加入於:v1.32#用於控制資源內容管理的可選設定。如果指定
attach
,則資源會以個別檔案或 ZIP 歸檔中的條目形式保存。如果指定embed
,則內容會內嵌儲存在 HAR 檔案中。 -
setUpdateMode
enum HarMode { FULL, MINIMAL }
(可選)加入於:v1.32#當設定為
minimal
時,僅記錄從 HAR 路由所需的資訊。這會省略大小、計時、頁面、Cookie、安全性以及其他在從 HAR 重新播放時未使用的 HAR 資訊類型。預設為minimal
。 -
用於比對請求 URL 的 glob 模式、正規表示式或謂詞。只有 URL 符合模式的請求才會從 HAR 檔案提供服務。如果未指定,則所有請求都從 HAR 檔案提供服務。
-
回傳
routeWebSocket
加入於:v1.48此方法允許修改瀏覽器上下文中任何頁面建立的 websocket 連線。
請注意,只有在此方法呼叫之後建立的 WebSocket
才會被路由。建議在建立任何頁面之前呼叫此方法。
用法
以下是一個簡單處理常式的範例,該處理常式會封鎖某些 websocket 訊息。請參閱 WebSocketRoute 以取得更多詳細資訊和範例。
context.routeWebSocket("/ws", ws -> {
ws.routeSend(message -> {
if ("to-be-blocked".equals(message))
return;
ws.send(message);
});
ws.connect();
});
參數
-
url
String | Pattern | Predicate<String>#只有 URL 符合此模式的 WebSocket 才會被路由。字串模式可以相對於 setBaseURL 上下文選項。
-
handler
Consumer<WebSocketRoute>#用於路由 WebSocket 的處理常式函數。
回傳
setDefaultNavigationTimeout
v1.9 之前加入此設定將變更以下方法和相關快速鍵的預設最大導航時間
- Page.goBack()
- Page.goForward()
- Page.navigate()
- Page.reload()
- Page.setContent()
- Page.waitForNavigation()
用法
BrowserContext.setDefaultNavigationTimeout(timeout);
參數
setDefaultTimeout
v1.9 之前加入此設定將變更所有接受 timeout 選項的方法的預設最大時間。
用法
BrowserContext.setDefaultTimeout(timeout);
參數
setExtraHTTPHeaders
v1.9 之前加入額外的 HTTP 標頭將與上下文中任何頁面啟動的每個請求一起傳送。這些標頭會與使用 Page.setExtraHTTPHeaders() 設定的頁面特定額外 HTTP 標頭合併。如果頁面覆寫特定標頭,則將使用頁面特定標頭值,而不是瀏覽器上下文標頭值。
BrowserContext.setExtraHTTPHeaders() 不保證傳出請求中標頭的順序。
用法
BrowserContext.setExtraHTTPHeaders(headers);
參數
回傳
setGeolocation
v1.9 之前加入設定上下文的地理位置。傳遞 null
或 undefined
會模擬位置不可用。
用法
browserContext.setGeolocation(new Geolocation(59.95, 30.31667));
考慮使用 BrowserContext.grantPermissions() 授予瀏覽器上下文頁面讀取其地理位置的權限。
參數
回傳
setOffline
v1.9 之前加入用法
BrowserContext.setOffline(offline);
參數
回傳
storageState
v1.9 之前加入傳回此瀏覽器 context 的儲存狀態,包含目前的 cookies 和本機儲存快照。
用法
BrowserContext.storageState();
BrowserContext.storageState(options);
參數
options
BrowserContext.StorageStateOptions
(optional)
回傳
unroute
v1.9 之前加入移除使用 BrowserContext.route() 建立的路由。當未指定 handler 時,會移除 url 的所有路由。
用法
BrowserContext.unroute(url);
BrowserContext.unroute(url, handler);
參數
-
url
String | Pattern | Predicate<String>#用於向 BrowserContext.route() 註冊路由的 glob 模式、regex 模式或接收 [URL] 的謂詞。
-
handler
Consumer<Route> (optional)#用於向 BrowserContext.route() 註冊路由的選用處理函式。
回傳
unrouteAll
新增於:v1.41移除使用 BrowserContext.route() 和 BrowserContext.routeFromHAR() 建立的所有路由。
用法
BrowserContext.unrouteAll();
回傳
waitForCondition
加入於:v1.32此方法會封鎖直到條件傳回 true 為止。當方法等待條件時,將會分派所有 Playwright 事件。
用法
使用此方法等待取決於頁面事件的條件
List<String> failedUrls = new ArrayList<>();
context.onResponse(response -> {
if (!response.ok()) {
failedUrls.add(response.url());
}
});
page1.getByText("Create user").click();
page2.getByText("Submit button").click();
context.waitForCondition(() -> failedUrls.size() > 3);
參數
-
condition
[BooleanSupplier]#要等待的條件。
-
options
BrowserContext.WaitForConditionOptions
(optional)-
等待的最長時間 (毫秒)。預設值為
30000
(30 秒)。傳遞0
以停用逾時。可以使用 BrowserContext.setDefaultTimeout() 或 Page.setDefaultTimeout() 方法變更預設值。
-
回傳
waitForConsoleMessage
新增於:v1.34執行動作並等待 context 中的頁面記錄 ConsoleMessage。如果提供謂詞,它會將 ConsoleMessage 值傳遞到 predicate
函式中,並等待 predicate(message)
傳回真值。如果在 BrowserContext.onConsoleMessage(handler) 事件觸發之前頁面已關閉,則會擲回錯誤。
用法
BrowserContext.waitForConsoleMessage(callback);
BrowserContext.waitForConsoleMessage(callback, options);
參數
-
options
BrowserContext.WaitForConsoleMessageOptions
(optional)-
setPredicate
Predicate<ConsoleMessage> (optional)#接收 ConsoleMessage 物件,並在應解析等待時解析為真值。
-
等待的最長時間 (毫秒)。預設值為
30000
(30 秒)。傳遞0
以停用逾時。可以使用 BrowserContext.setDefaultTimeout() 方法變更預設值。
-
-
執行觸發事件之動作的回呼。
回傳
waitForPage
新增於:v1.9執行動作並等待在 context 中建立新的 Page。如果提供謂詞,它會將 Page 值傳遞到 predicate
函式中,並等待 predicate(event)
傳回真值。如果在建立新的 Page 之前 context 已關閉,則會擲回錯誤。
用法
BrowserContext.waitForPage(callback);
BrowserContext.waitForPage(callback, options);
參數
-
options
BrowserContext.WaitForPageOptions
(optional) -
執行觸發事件之動作的回呼。
回傳
屬性
clock()
新增於:v1.45Playwright 具有模擬時鐘和時間流逝的功能。
用法
BrowserContext.clock()
回傳
request()
新增於:v1.16與此 context 相關聯的 API 測試 helper。使用此 API 提出的請求將使用 context cookies。
用法
BrowserContext.request()
回傳
tracing()
新增於:v1.12用法
BrowserContext.tracing()
回傳
事件
onBackgroundPage(handler)
加入於:v1.11僅適用於 Chromium 瀏覽器的持續性 context。
當在此 context 中建立新的背景頁面時發出。
context.onBackgroundPage(backgroundPage -> {
System.out.println(backgroundPage.url());
});
用法
BrowserContext.onBackgroundPage(handler)
事件資料
onClose(handler)
v1.9 之前加入當瀏覽器 context 關閉時發出。發生原因可能如下:
- 瀏覽器 context 已關閉。
- 瀏覽器應用程式已關閉或崩潰。
- 已呼叫 Browser.close() 方法。
用法
BrowserContext.onClose(handler)
事件資料
onConsoleMessage(handler)
新增於:v1.34當頁面內的 JavaScript 呼叫其中一個 console API 方法 (例如 console.log
或 console.dir
) 時發出。
傳遞到 console.log
的引數和頁面可在 ConsoleMessage 事件處理常式引數中使用。
用法
context.onConsoleMessage(msg -> {
for (int i = 0; i < msg.args().size(); ++i)
System.out.println(i + ": " + msg.args().get(i).jsonValue());
});
page.evaluate("() => console.log('hello', 5, { foo: 'bar' })");
事件資料
onDialog(handler)
新增於:v1.34當 JavaScript 對話方塊出現時發出,例如 alert
、prompt
、confirm
或 beforeunload
。Listener **必須** Dialog.accept() 或 Dialog.dismiss() 對話方塊 - 否則頁面會 凍結 等待對話方塊,而點擊等動作永遠不會完成。
用法
context.onDialog(dialog -> {
dialog.accept();
});
當沒有 Page.onDialog(handler) 或 BrowserContext.onDialog(handler) listener 時,所有對話方塊都會自動關閉。
事件資料
onPage(handler)
v1.9 之前加入當在 BrowserContext 中建立新 Page 時發出此事件。頁面可能仍在載入中。此事件也會針對彈出式頁面觸發。另請參閱 Page.onPopup(handler),以接收與特定頁面相關的彈出式視窗事件。
頁面可用的最早時間是導覽至初始 URL 時。例如,當使用 window.open('http://example.com')
開啟彈出式視窗時,此事件將在對 "http://example.com" 的網路請求完成且其回應已開始在彈出式視窗中載入時觸發。如果您想要路由/監聽此網路請求,請分別使用 BrowserContext.route() 和 BrowserContext.onRequest(handler),而不是 Page 上的類似方法。
Page newPage = context.waitForPage(() -> {
page.getByText("open new page").click();
});
System.out.println(newPage.evaluate("location.href"));
使用 Page.waitForLoadState() 等待頁面達到特定狀態 (在大多數情況下您應該不需要它)。
用法
BrowserContext.onPage(handler)
事件資料
onRequest(handler)
新增於:v1.12當從透過此 context 建立的任何頁面發出請求時發出。 request 物件是唯讀的。若只要監聽來自特定頁面的請求,請使用 Page.onRequest(handler)。
為了攔截和變更請求,請參閱 BrowserContext.route() 或 Page.route()。
用法
BrowserContext.onRequest(handler)
事件資料
onRequestFailed(handler)
新增於:v1.12當請求失敗時發出,例如逾時。若只要監聽來自特定頁面的失敗請求,請使用 Page.onRequestFailed(handler)。
HTTP 錯誤回應 (例如 404 或 503) 從 HTTP 的角度來看仍然是成功的回應,因此請求將使用 BrowserContext.onRequestFinished(handler) 事件完成,而不是 BrowserContext.onRequestFailed(handler)。
用法
BrowserContext.onRequestFailed(handler)
事件資料
onRequestFinished(handler)
新增於:v1.12當請求在下載回應主體後成功完成時發出。對於成功的回應,事件順序為 request
、response
和 requestfinished
。若要監聽來自特定頁面的成功請求事件,請使用 Page.onRequestFinished(handler)。
用法
BrowserContext.onRequestFinished(handler)
事件資料
onResponse(handler)
新增於:v1.12當收到請求的 response 狀態和標頭時發出。對於成功的回應,事件順序為 request
、response
和 requestfinished
。若要監聽來自特定頁面的回應事件,請使用 Page.onResponse(handler)。
用法
BrowserContext.onResponse(handler)
事件資料
onWebError(handler)
新增於:v1.38當此 context 中任何頁面發生未處理的例外狀況時發出。若要監聽來自特定頁面的錯誤,請改用 Page.onPageError(handler)。
用法
BrowserContext.onWebError(handler)
事件資料