class: BrowserContext
Added in: v1.8
BrowserContexts provide a way to operate multiple independent browser sessions.
If a page opens another page, e.g. with a window.open call, the popup will belong to the parent page's browser
context.
copilotbrowser allows creating isolated non-persistent browser contexts with Browser.newContext() method. Non-persistent browser contexts don't write any browsing data to disk.
// Create a new incognito browser context
const context = await browser.newContext();
// Create a new page inside context.
const page = await context.newPage();
await page.goto('https://example.com');
// Dispose context once it's no longer needed.
await context.close();
// 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();
# create a new incognito browser context
context = await browser.new_context()
# create a new page inside context.
page = await context.new_page()
await page.goto("https://example.com")
# dispose context once it is no longer needed.
await context.close()
# create a new incognito browser context
context = browser.new_context()
# create a new page inside context.
page = context.new_page()
page.goto("https://example.com")
# dispose context once it is no longer needed.
context.close()
using var copilotbrowser = await copilotbrowser.CreateAsync();
var browser = await copilotbrowser.Firefox.LaunchAsync(new() { Headless = false });
// Create a new incognito browser context
var context = await browser.NewContextAsync();
// Create a new page inside context.
var page = await context.NewPageAsync();
await page.GotoAsync("https://bing.com");
// Dispose context once it is no longer needed.
await context.CloseAsync();
event: BrowserContext.backgroundPage
Added in: v1.11
⚠️ Deprecated. Background pages have been removed from Chromium together with Manifest V2 extensions.
- argument: <
Page>
This event is not emitted.
property: BrowserContext.clock
Added in: v1.45
Type:
Clock
copilotbrowser has ability to mock clock and passage of time.
event: BrowserContext.close
Added in: v1.8
- argument: <
BrowserContext>
Emitted when Browser context gets closed. This might happen because of one of the following:
- Browser context is closed.
- Browser application is closed or crashed.
- The Browser.close() method was called.
option: BrowserContext.close.reason
Added in: v1.40
reason<string>
The reason to be reported to the operations interrupted by the context closure.
event: BrowserContext.console
Added in: v1.34
Languages: (all)
- argument: <
ConsoleMessage>
Emitted when JavaScript within the page calls one of console API methods, e.g. console.log or console.dir.
The arguments passed into console.log and the page are available on the ConsoleMessage event handler argument.
Usage
context.on('console', async msg => {
const values = [];
for (const arg of msg.args())
values.push(await arg.jsonValue());
console.log(...values);
});
await page.evaluate(() => console.log('hello', 5, { foo: 'bar' }));
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' })");
async def print_args(msg):
values = []
for arg in msg.args:
values.append(await arg.json_value())
print(values)
context.on("console", print_args)
await page.evaluate("console.log('hello', 5, { foo: 'bar' })")
def print_args(msg):
for arg in msg.args:
print(arg.json_value())
context.on("console", print_args)
page.evaluate("console.log('hello', 5, { foo: 'bar' })")
context.Console += async (_, msg) =>
{
foreach (var arg in msg.Args)
Console.WriteLine(await arg.JsonValueAsync<object>());
};
await page.EvaluateAsync("console.log('hello', 5, { foo: 'bar' })");
event: BrowserContext.dialog
Added in: v1.34
- argument: <
Dialog>
Emitted when a JavaScript dialog appears, such as alert, prompt, confirm or beforeunload. Listener must either Dialog.accept() or Dialog.dismiss() the dialog - otherwise the page will freeze waiting for the dialog, and actions like click will never finish.
Usage
context.on('dialog', dialog => {
dialog.accept();
});
context.onDialog(dialog -> {
dialog.accept();
});
context.on("dialog", lambda dialog: dialog.accept())
Context.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
When no Page.event('dialog') or BrowserContext.event('dialog') listeners are present, all dialogs are automatically dismissed.
event: BrowserContext.page
Added in: v1.8
- argument: <
Page>
The event is emitted when a new Page is created in the BrowserContext. The page may still be loading. The event will also fire for popup pages. See also Page.event('popup') to receive events about popups relevant to a specific page.
The earliest moment that page is available is when it has navigated to the initial url. For example, when opening a
popup with window.open('http://example.com'), this event will fire when the network request to "http://example.com" is
done and its response has started loading in the popup. If you would like to route/listen to this network request, use BrowserContext.route() and BrowserContext.event('request') respectively instead of similar methods on the Page.
const newPagePromise = context.waitForEvent('page');
await page.getByText('open new page').click();
const newPage = await newPagePromise;
console.log(await newPage.evaluate('location.href'));
Page newPage = context.waitForPage(() -> {
page.getByText("open new page").click();
});
System.out.println(newPage.evaluate("location.href"));
async with context.expect_page() as page_info:
await page.get_by_text("open new page").click(),
page = await page_info.value
print(await page.evaluate("location.href"))
with context.expect_page() as page_info:
page.get_by_text("open new page").click(),
page = page_info.value
print(page.evaluate("location.href"))
var popup = await context.RunAndWaitForPageAsync(async =>
{
await page.GetByText("open new page").ClickAsync();
});
Console.WriteLine(await popup.EvaluateAsync<string>("location.href"));
Use Page.waitForLoadState() to wait until the page gets to a particular state (you should not need it in most cases).
event: BrowserContext.webError
Added in: v1.38
- argument: <
WebError>
Emitted when exception is unhandled in any of the pages in this context. To listen for errors from a particular page, use Page.event('pageError') instead.
event: BrowserContext.request
Added in: v1.12
- argument: <
Request>
Emitted when a request is issued from any pages created through this context.
The request object is read-only. To only listen for requests from a particular
page, use Page.event('request').
In order to intercept and mutate requests, see BrowserContext.route() or Page.route().
event: BrowserContext.requestFailed
Added in: v1.12
- argument: <
Request>
Emitted when a request fails, for example by timing out. To only listen for failed requests from a particular page, use Page.event('requestFailed').
HTTP Error responses, such as 404 or 503, are still successful responses from HTTP standpoint, so request will complete with BrowserContext.event('requestFinished') event and not with BrowserContext.event('requestFailed').
event: BrowserContext.requestFinished
Added in: v1.12
- argument: <
Request>
Emitted when a request finishes successfully after downloading the response body. For a successful response, the
sequence of events is request, response and requestfinished. To listen for
successful requests from a particular page, use Page.event('requestFinished').
event: BrowserContext.response
Added in: v1.12
- argument: <
Response>
Emitted when response status and headers are received for a request. For a successful response, the sequence of events
is request, response and requestfinished. To listen for response events
from a particular page, use Page.event('response').
event: BrowserContext.serviceWorker
Added in: v1.11
Languages: JavaScript, Python
- argument: <
Worker>
Service workers are only supported on Chromium-based browsers.
Emitted when new service worker is created in the context.
async method: BrowserContext.addCookies
Added in: v1.8
Adds cookies into this browser context. All pages within this context will have these cookies installed. Cookies can be obtained via BrowserContext.cookies().
Usage
await browserContext.addCookies([cookieObject1, cookieObject2]);
browserContext.addCookies(Arrays.asList(cookieObject1, cookieObject2));
await browser_context.add_cookies([cookie_object1, cookie_object2])
browser_context.add_cookies([cookie_object1, cookie_object2])
await context.AddCookiesAsync(new[] { cookie1, cookie2 });
param: BrowserContext.addCookies.cookies
Added in: v1.8
cookies<Array<Object>>name<string>value<string>url?<string> Eitherurlor bothdomainandpathare required. Optional.domain?<string> For the cookie to apply to all subdomains as well, prefix domain with a dot, like this: ".example.com". Eitherurlor bothdomainandpathare required. Optional.path?<string> Eitherurlor bothdomainandpathare required. Optional.expires?<float> Unix time in seconds. Optional.httpOnly?<boolean> Optional.secure?<boolean> Optional.sameSite?<SameSiteAttribute<"Strict"|"Lax"|"None">> Optional.partitionKey?<string> For partitioned third-party cookies (aka CHIPS), the partition key. Optional.
async method: BrowserContext.addInitScript
Added in: v1.8
Adds a script which would be evaluated in one of the following scenarios:
- Whenever a page is created in the browser context or is navigated.
- Whenever a child frame is attached or navigated in any page in the browser context. In this case, the script is evaluated in the context of the newly attached frame.
The script is evaluated after the document was created but before any of its scripts were run. This is useful to amend
the JavaScript environment, e.g. to seed Math.random.
Usage
An example of overriding Math.random before the page loads:
// preload.js
Math.random = () => 42;
// In your copilotbrowser script, assuming the preload.js file is in same directory.
await browserContext.addInitScript({
path: 'preload.js'
});
// In your copilotbrowser script, assuming the preload.js file is in same directory.
browserContext.addInitScript(Paths.get("preload.js"));
# in your copilotbrowser script, assuming the preload.js file is in same directory.
await browser_context.add_init_script(path="preload.js")
# in your copilotbrowser script, assuming the preload.js file is in same directory.
browser_context.add_init_script(path="preload.js")
await Context.AddInitScriptAsync(scriptPath: "preload.js");
The order of evaluation of multiple scripts installed via BrowserContext.addInitScript() and Page.addInitScript() is not defined.
param: BrowserContext.addInitScript.script
Added in: v1.8
Languages: JavaScript
script<function|string|Object>path?<path> Path to the JavaScript file. Ifpathis a relative path, then it is resolved relative to the current working directory. Optional.content?<string> Raw script content. Optional.
Script to be evaluated in all pages in the browser context.
param: BrowserContext.addInitScript.script
Added in: v1.8
Languages: C#, Java
script<string|path>
Script to be evaluated in all pages in the browser context.
param: BrowserContext.addInitScript.arg
Added in: v1.8
Languages: JavaScript
arg?<Serializable>
Optional argument to pass to script (only supported when passing a function).
param: BrowserContext.addInitScript.path
Added in: v1.8
Languages: Python
path?<path>
Path to the JavaScript file. If path is a relative path, then it is resolved relative to the current working directory. Optional.
param: BrowserContext.addInitScript.script
Added in: v1.8
Languages: Python
script?<string>
Script to be evaluated in all pages in the browser context. Optional.
method: BrowserContext.backgroundPages
Added in: v1.11
⚠️ Deprecated. Background pages have been removed from Chromium together with Manifest V2 extensions. Returns:
Array<Page>
Returns an empty list.
method: BrowserContext.browser
Added in: v1.8 Returns:
null|Browser
Gets the browser instance that owns the context. Returns null if the context is created outside of normal browser, e.g. Android or Electron.
async method: BrowserContext.clearCookies
Added in: v1.8
Removes cookies from context. Accepts optional filter.
Usage
await context.clearCookies();
await context.clearCookies({ name: 'session-id' });
await context.clearCookies({ domain: 'my-origin.com' });
await context.clearCookies({ domain: /.*my-origin\.com/ });
await context.clearCookies({ path: '/api/v1' });
await context.clearCookies({ name: 'session-id', domain: 'my-origin.com' });
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"));
await context.clear_cookies()
await context.clear_cookies(name="session-id")
await context.clear_cookies(domain="my-origin.com")
await context.clear_cookies(path="/api/v1")
await context.clear_cookies(name="session-id", domain="my-origin.com")
context.clear_cookies()
context.clear_cookies(name="session-id")
context.clear_cookies(domain="my-origin.com")
context.clear_cookies(path="/api/v1")
context.clear_cookies(name="session-id", domain="my-origin.com")
await context.ClearCookiesAsync();
await context.ClearCookiesAsync(new() { Name = "session-id" });
await context.ClearCookiesAsync(new() { Domain = "my-origin.com" });
await context.ClearCookiesAsync(new() { Path = "/api/v1" });
await context.ClearCookiesAsync(new() { Name = "session-id", Domain = "my-origin.com" });
option: BrowserContext.clearCookies.name
Added in: v1.43
name<string|RegExp>
Only removes cookies with the given name.
option: BrowserContext.clearCookies.domain
Added in: v1.43
domain<string|RegExp>
Only removes cookies with the given domain.
option: BrowserContext.clearCookies.path
Added in: v1.43
path<string|RegExp>
Only removes cookies with the given path.
async method: BrowserContext.clearPermissions
Added in: v1.8
Clears all permission overrides for the browser context.
Usage
const context = await browser.newContext();
await context.grantPermissions(['clipboard-read']);
// do stuff ..
context.clearPermissions();
BrowserContext context = browser.newContext();
context.grantPermissions(Arrays.asList("clipboard-read"));
// do stuff ..
context.clearPermissions();
context = await browser.new_context()
await context.grant_permissions(["clipboard-read"])
# do stuff ..
context.clear_permissions()
context = browser.new_context()
context.grant_permissions(["clipboard-read"])
# do stuff ..
context.clear_permissions()
var context = await browser.NewContextAsync();
await context.GrantPermissionsAsync(new[] { "clipboard-read" });
// Alternatively, you can use the helper class ContextPermissions
// to specify the permissions...
// do stuff ...
await context.ClearPermissionsAsync();
async method: BrowserContext.close
Added in: v1.8
Closes the browser context. All the pages that belong to the browser context will be closed.
The default browser context cannot be closed.
async method: BrowserContext.cookies
Added in: v1.8 Returns:
Array<Object>
name<string>value<string>domain<string>path<string>expires<float> Unix time in seconds.httpOnly<boolean>secure<boolean>sameSite<SameSiteAttribute<"Strict"|"Lax"|"None">>partitionKey?<string>
If no URLs are specified, this method returns all cookies. If URLs are specified, only cookies that affect those URLs are returned.
param: BrowserContext.cookies.urls
Added in: v1.8
urls?<string|Array<string>>
Optional list of URLs.
async method: BrowserContext.exposeBinding
Added in: v1.8
The method adds a function called name on the window object of every frame in every page in the context.
When called, the function executes callback and returns a Promise which resolves to the return value of
callback. If the callback returns a Promise, it will be awaited.
The first argument of the callback function contains information about the caller: { browserContext: BrowserContext, page: Page, frame: Frame }.
See Page.exposeBinding() for page-only version.
Usage
An example of exposing page URL to all frames in all pages in the context:
const { webkit } = require('copilotbrowser'); // Or 'chromium' or 'firefox'.
(async () => {
const browser = await webkit.launch({ headless: false });
const context = await browser.newContext();
await context.exposeBinding('pageURL', ({ page }) => page.url());
const page = await context.newPage();
await page.setContent(`
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
`);
await page.getByRole('button').click();
})();
import com.microsoft.copilotbrowser.*;
public class Example {
public static void main(String[] args) {
try (copilotbrowser copilotbrowser = copilotbrowser.create()) {
BrowserType webkit = copilotbrowser.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();
}
}
}
import asyncio
from copilotbrowser.async_api import async_copilotbrowser, copilotbrowser
async def run(copilotbrowser: copilotbrowser):
webkit = copilotbrowser.webkit
browser = await webkit.launch(headless=False)
context = await browser.new_context()
await context.expose_binding("pageURL", lambda source: source["page"].url)
page = await context.new_page()
await page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
await page.get_by_role("button").click()
async def main():
async with async_copilotbrowser() as copilotbrowser:
await run(copilotbrowser)
asyncio.run(main())
from copilotbrowser.sync_api import sync_copilotbrowser, copilotbrowser
def run(copilotbrowser: copilotbrowser):
webkit = copilotbrowser.webkit
browser = webkit.launch(headless=False)
context = browser.new_context()
context.expose_binding("pageURL", lambda source: source["page"].url)
page = context.new_page()
page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
page.get_by_role("button").click()
with sync_copilotbrowser() as copilotbrowser:
run(copilotbrowser)
using Microsoft.copilotbrowser;
using var copilotbrowser = await copilotbrowser.CreateAsync();
var browser = await copilotbrowser.Webkit.LaunchAsync(new() { Headless = false });
var context = await browser.NewContextAsync();
await context.ExposeBindingAsync("pageURL", source => source.Page.Url);
var page = await context.NewPageAsync();
await page.SetContentAsync("<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>");
await page.GetByRole(AriaRole.Button).ClickAsync();
param: BrowserContext.exposeBinding.name
Added in: v1.8
name<string>
Name of the function on the window object.
param: BrowserContext.exposeBinding.callback
Added in: v1.8
callback<function>
Callback function that will be called in the copilotbrowser's context.
option: BrowserContext.exposeBinding.handle
Added in: v1.8
⚠️ Deprecated. This option will be removed in the future.
handle<boolean>
Whether to pass the argument as a handle, instead of passing by value. When passing a handle, only one argument is supported. When passing by value, multiple arguments are supported.
async method: BrowserContext.exposeFunction
Added in: v1.8
The method adds a function called name on the window object of every frame in every page in the context.
When called, the function executes callback and returns a Promise which resolves to the return value of
callback.
If the callback returns a Promise, it will be awaited.
See Page.exposeFunction() for page-only version.
Usage
An example of adding a sha256 function to all pages in the context:
const { webkit } = require('copilotbrowser'); // Or 'chromium' or 'firefox'.
const crypto = require('crypto');
(async () => {
const browser = await webkit.launch({ headless: false });
const context = await browser.newContext();
await context.exposeFunction('sha256', text =>
crypto.createHash('sha256').update(text).digest('hex'),
);
const page = await context.newPage();
await page.setContent(`
<script>
async function onClick() {
document.querySelector('div').textContent = await window.sha256('copilotbrowser');
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
`);
await page.getByRole('button').click();
})();
import com.microsoft.copilotbrowser.*;
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 (copilotbrowser copilotbrowser = copilotbrowser.create()) {
BrowserType webkit = copilotbrowser.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('copilotbrowser');\n" +
" }\n" +
"</script>\n" +
"<button onclick=\"onClick()\">Click me</button>\n" +
"<div></div>\n");
page.getByRole(AriaRole.BUTTON).click();
}
}
}
import asyncio
import hashlib
from copilotbrowser.async_api import async_copilotbrowser, copilotbrowser
def sha256(text: str) -> str:
m = hashlib.sha256()
m.update(bytes(text, "utf8"))
return m.hexdigest()
async def run(copilotbrowser: copilotbrowser):
webkit = copilotbrowser.webkit
browser = await webkit.launch(headless=False)
context = await browser.new_context()
await context.expose_function("sha256", sha256)
page = await context.new_page()
await page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.sha256('copilotbrowser');
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
await page.get_by_role("button").click()
async def main():
async with async_copilotbrowser() as copilotbrowser:
await run(copilotbrowser)
asyncio.run(main())
import hashlib
from copilotbrowser.sync_api import sync_copilotbrowser
def sha256(text: str) -> str:
m = hashlib.sha256()
m.update(bytes(text, "utf8"))
return m.hexdigest()
def run(copilotbrowser: copilotbrowser):
webkit = copilotbrowser.webkit
browser = webkit.launch(headless=False)
context = browser.new_context()
context.expose_function("sha256", sha256)
page = context.new_page()
page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.sha256('copilotbrowser');
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
page.get_by_role("button").click()
with sync_copilotbrowser() as copilotbrowser:
run(copilotbrowser)
using Microsoft.copilotbrowser;
using System;
using System.Security.Cryptography;
using System.Threading.Tasks;
class BrowserContextExamples
{
public static async Task Main()
{
using var copilotbrowser = await copilotbrowser.CreateAsync();
var browser = await copilotbrowser.Webkit.LaunchAsync(new() { Headless = false });
var context = await browser.NewContextAsync();
await context.ExposeFunctionAsync("sha256", (string input) =>
{
return Convert.ToBase64String(
SHA256.Create().ComputeHash(System.Text.Encoding.UTF8.GetBytes(input)));
});
var page = await context.NewPageAsync();
await page.SetContentAsync("<script>\n" +
" async function onClick() {\n" +
" document.querySelector('div').textContent = await window.sha256('copilotbrowser');\n" +
" }\n" +
"</script>\n" +
"<button onclick=\"onClick()\">Click me</button>\n" +
"<div></div>");
await page.GetByRole(AriaRole.Button).ClickAsync();
Console.WriteLine(await page.TextContentAsync("div"));
}
}
param: BrowserContext.exposeFunction.name
Added in: v1.8
name<string>
Name of the function on the window object.
param: BrowserContext.exposeFunction.callback
Added in: v1.8
callback<function>
Callback function that will be called in the copilotbrowser's context.
async method: BrowserContext.grantPermissions
Added in: v1.8
Grants specified permissions to the browser context. Only grants corresponding permissions to the given origin if specified.
param: BrowserContext.grantPermissions.permissions
Added in: v1.8
permissions<Array<string>>
A list of permissions to grant.
Supported permissions differ between browsers, and even between different versions of the same browser. Any permission may stop working after an update.
Here are some permissions that may be supported by some browsers:
'accelerometer''ambient-light-sensor''background-sync''camera''clipboard-read''clipboard-write''geolocation''gyroscope''local-fonts''local-network-access''magnetometer''microphone''midi-sysex'(system-exclusive midi)'midi''notifications''payment-handler''storage-access''screen-wake-lock'
option: BrowserContext.grantPermissions.origin
Added in: v1.8
origin<string>
The origin to grant permissions to, e.g. "https://example.com".
async method: BrowserContext.newCDPSession
Added in: v1.11 Returns:
CDPSession
CDP sessions are only supported on Chromium-based browsers.
Returns the newly created session.
param: BrowserContext.newCDPSession.page
Added in: v1.11
page<Page|Frame>
Target to create new session for. For backwards-compatibility, this parameter is
named page, but it can be a Page or Frame type.
async method: BrowserContext.newPage
Added in: v1.8 Returns:
Page
Creates a new page in the browser context.
method: BrowserContext.pages
Added in: v1.8 Returns:
Array<Page>
Returns all open pages in the context.
async method: BrowserContext.removeAllListeners
Added in: v1.47
Languages: JavaScript
Removes all the listeners of the given type (or all registered listeners if no type given). Allows to wait for async listeners to complete or to ignore subsequent errors from these listeners.
param: BrowserContext.removeAllListeners.type
Added in: v1.47
type?<string>
option: BrowserContext.removeAllListeners.behavior = %%-remove-all-listeners-options-behavior-%%
Added in: v1.47
property: BrowserContext.request
Added in: v1.16
Languages: (all)
Type:
APIRequestContext
API testing helper associated with this context. Requests made with this API will use context cookies.
async method: BrowserContext.route
Added in: v1.8
Routing provides the capability to modify network requests that are made by any page in the browser context. Once route is enabled, every request matching the url pattern will stall unless it's continued, fulfilled or aborted.
BrowserContext.route() will not intercept requests intercepted by Service Worker. See this issue. We recommend disabling Service Workers when using request interception by setting Browser.newContext.serviceWorkers to 'block'.
Usage
An example of a naive handler that aborts all image requests:
const context = await browser.newContext();
await context.route('**/*.{png,jpg,jpeg}', route => route.abort());
const page = await context.newPage();
await page.goto('https://example.com');
await browser.close();
BrowserContext context = browser.newContext();
context.route("**/*.{png,jpg,jpeg}", route -> route.abort());
Page page = context.newPage();
page.navigate("https://example.com");
browser.close();
context = await browser.new_context()
page = await context.new_page()
await context.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
await page.goto("https://example.com")
await browser.close()
context = browser.new_context()
page = context.new_page()
context.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
page.goto("https://example.com")
browser.close()
var context = await browser.NewContextAsync();
var page = await context.NewPageAsync();
await context.RouteAsync("**/*.{png,jpg,jpeg}", r => r.AbortAsync());
await page.GotoAsync("https://theverge.com");
await browser.CloseAsync();
or the same snippet using a regex pattern instead:
const context = await browser.newContext();
await context.route(/(\.png$)|(\.jpg$)/, route => route.abort());
const page = await context.newPage();
await page.goto('https://example.com');
await browser.close();
BrowserContext context = browser.newContext();
context.route(Pattern.compile("(\\.png$)|(\\.jpg$)"), route -> route.abort());
Page page = context.newPage();
page.navigate("https://example.com");
browser.close();
context = await browser.new_context()
page = await context.new_page()
await context.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page = await context.new_page()
await page.goto("https://example.com")
await browser.close()
context = browser.new_context()
page = context.new_page()
context.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page = await context.new_page()
page = context.new_page()
page.goto("https://example.com")
browser.close()
var context = await browser.NewContextAsync();
var page = await context.NewPageAsync();
await context.RouteAsync(new Regex("(\\.png$)|(\\.jpg$)"), r => r.AbortAsync());
await page.GotoAsync("https://theverge.com");
await browser.CloseAsync();
It is possible to examine the request to decide the route action. For example, mocking all requests that contain some post data, and leaving all other requests as is:
await context.route('/api/**', async route => {
if (route.request().postData().includes('my-string'))
await route.fulfill({ body: 'mocked-data' });
else
await route.continue();
});
context.route("/api/**", route -> {
if (route.request().postData().contains("my-string"))
route.fulfill(new Route.FulfillOptions().setBody("mocked-data"));
else
route.resume();
});
async def handle_route(route: Route):
if ("my-string" in route.request.post_data):
await route.fulfill(body="mocked-data")
else:
await route.continue_()
await context.route("/api/**", handle_route)
def handle_route(route: Route):
if ("my-string" in route.request.post_data):
route.fulfill(body="mocked-data")
else:
route.continue_()
context.route("/api/**", handle_route)
await page.RouteAsync("/api/**", async r =>
{
if (r.Request.PostData.Contains("my-string"))
await r.FulfillAsync(new() { Body = "mocked-data" });
else
await r.ContinueAsync();
});
Page routes (set up with Page.route()) take precedence over browser context routes when request matches both handlers.
To remove a route with its handler you can use BrowserContext.unroute().
Enabling routing disables http cache.
param: BrowserContext.route.url
Added in: v1.8
Languages: JavaScript
url<string|RegExp|URLPattern|function(URL):boolean>
A glob pattern, regex pattern, URL pattern, or predicate that receives a URL to match during routing. If Browser.newContext.baseURL is set in the context options and the provided URL is a string that does not start with *, it is resolved using the new URL() constructor.
param: BrowserContext.route.url
Added in: v1.8
Languages: Python, C#, Java
url<string|RegExp|function(URL):boolean>
A glob pattern, regex pattern, or predicate that receives a URL to match during routing. If Browser.newContext.baseURL is set in the context options and the provided URL is a string that does not start with *, it is resolved using the new URL() constructor.
param: BrowserContext.route.handler
Added in: v1.8
Languages: JavaScript, Python
handler<function(Route,Request): [Promise|any]>
handler function to route the request.
param: BrowserContext.route.handler
Added in: v1.8
Languages: C#, Java
handler<function(Route)>
handler function to route the request.
option: BrowserContext.route.times
Added in: v1.15
times<int>
How often a route should be used. By default it will be used every time.
async method: BrowserContext.routeFromHAR
Added in: v1.23
If specified the network requests that are made in the context will be served from the HAR file. Read more about Replaying from HAR.
copilotbrowser will not serve requests intercepted by Service Worker from the HAR file. See this issue. We recommend disabling Service Workers when using request interception by setting Browser.newContext.serviceWorkers to 'block'.
param: BrowserContext.routeFromHAR.har
Added in: v1.23
har<path>
Path to a HAR file with prerecorded network data. If path is a relative path, then it is resolved relative to the current working directory.
option: BrowserContext.routeFromHAR.notFound
Added in: v1.23
notFound?<HarNotFound<"abort"|"fallback">>
- If set to 'abort' any request not found in the HAR file will be aborted.
- If set to 'fallback' falls through to the next route handler in the handler chain.
Defaults to abort.
option: BrowserContext.routeFromHAR.update
Added in: v1.23
update?
If specified, updates the given HAR with the actual network information instead of serving from file. The file is written to disk when BrowserContext.close() is called.
option: BrowserContext.routeFromHAR.url
Added in: v1.23
url<string|RegExp>
A glob pattern, regular expression or predicate to match the request URL. Only requests with URL matching the pattern will be served from the HAR file. If not specified, all requests are served from the HAR file.
option: BrowserContext.routeFromHAR.updateMode
Added in: v1.32
updateMode<HarMode<"full"|"minimal">>
When set to minimal, only record information necessary for routing from HAR. This omits sizes, timing, page, cookies, security and other types of HAR information that are not used when replaying from HAR. Defaults to minimal.
option: BrowserContext.routeFromHAR.updateContent
Added in: v1.32
updateContent<RouteFromHarUpdateContentPolicy<"embed"|"attach">>
Optional setting to control resource content management. If attach is specified, resources are persisted as separate files or entries in the ZIP archive. If embed is specified, content is stored inline the HAR file.
async method: BrowserContext.routeWebSocket
Added in: v1.48
This method allows to modify websocket connections that are made by any page in the browser context.
Note that only WebSockets created after this method was called will be routed. It is recommended to call this method before creating any pages.
Usage
Below is an example of a simple handler that blocks some websocket messages.
See WebSocketRoute for more details and examples.
await context.routeWebSocket('/ws', async ws => {
ws.routeSend(message => {
if (message === 'to-be-blocked')
return;
ws.send(message);
});
await ws.connect();
});
context.routeWebSocket("/ws", ws -> {
ws.routeSend(message -> {
if ("to-be-blocked".equals(message))
return;
ws.send(message);
});
ws.connect();
});
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
if message == "to-be-blocked":
return
ws.send(message)
async def handler(ws: WebSocketRoute):
ws.route_send(lambda message: message_handler(ws, message))
await ws.connect()
await context.route_web_socket("/ws", handler)
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
if message == "to-be-blocked":
return
ws.send(message)
def handler(ws: WebSocketRoute):
ws.route_send(lambda message: message_handler(ws, message))
ws.connect()
context.route_web_socket("/ws", handler)
await context.RouteWebSocketAsync("/ws", async ws => {
ws.RouteSend(message => {
if (message == "to-be-blocked")
return;
ws.Send(message);
});
await ws.ConnectAsync();
});
param: BrowserContext.routeWebSocket.url
Added in: v1.48
url<string|RegExp|function(URL):boolean>
Only WebSockets with the url matching this pattern will be routed. A string pattern can be relative to the Browser.newContext.baseURL context option.
param: BrowserContext.routeWebSocket.handler
Added in: v1.48
Languages: JavaScript, Python
handler<function(WebSocketRoute): [Promise|any]>
Handler function to route the WebSocket.
param: BrowserContext.routeWebSocket.handler
Added in: v1.48
Languages: C#, Java
handler<function(WebSocketRoute)>
Handler function to route the WebSocket.
method: BrowserContext.serviceWorkers
Added in: v1.11
Languages: JavaScript, Python Returns:
Array<Worker>
Service workers are only supported on Chromium-based browsers.
All existing service workers in the context.
method: BrowserContext.setDefaultNavigationTimeout
Added in: v1.8
This setting will change the default maximum navigation time for the following methods and related shortcuts:
- Page.goBack()
- Page.goForward()
- Page.goto()
- Page.reload()
- Page.setContent()
- Page.waitForNavigation()
Page.setDefaultNavigationTimeout() and Page.setDefaultTimeout() take priority over BrowserContext.setDefaultNavigationTimeout().
param: BrowserContext.setDefaultNavigationTimeout.timeout
Added in: v1.8
timeout<float>
Maximum navigation time in milliseconds
method: BrowserContext.setDefaultTimeout
Added in: v1.8
This setting will change the default maximum time for all the methods accepting timeout option.
Page.setDefaultNavigationTimeout(), Page.setDefaultTimeout() and BrowserContext.setDefaultNavigationTimeout() take priority over BrowserContext.setDefaultTimeout().
param: BrowserContext.setDefaultTimeout.timeout
Added in: v1.8
timeout<float>
Maximum time in milliseconds. Pass 0 to disable timeout.
async method: BrowserContext.setExtraHTTPHeaders
Added in: v1.8
The extra HTTP headers will be sent with every request initiated by any page in the context. These headers are merged with page-specific extra HTTP headers set with Page.setExtraHTTPHeaders(). If page overrides a particular header, page-specific header value will be used instead of the browser context header value.
BrowserContext.setExtraHTTPHeaders() does not guarantee the order of headers in the outgoing requests.
param: BrowserContext.setExtraHTTPHeaders.headers
Added in: v1.8
headers<Object<string,string>>
An object containing additional HTTP headers to be sent with every request. All header values must be strings.
async method: BrowserContext.setGeolocation
Added in: v1.8
Sets the context's geolocation. Passing null or undefined emulates position unavailable.
Usage
await browserContext.setGeolocation({ latitude: 59.95, longitude: 30.31667 });
browserContext.setGeolocation(new Geolocation(59.95, 30.31667));
await browser_context.set_geolocation({"latitude": 59.95, "longitude": 30.31667})
browser_context.set_geolocation({"latitude": 59.95, "longitude": 30.31667})
await context.SetGeolocationAsync(new Geolocation()
{
Latitude = 59.95f,
Longitude = 30.31667f
});
Consider using BrowserContext.grantPermissions() to grant permissions for the browser context pages to read its geolocation.
param: BrowserContext.setGeolocation.geolocation
Added in: v1.8
geolocation<null|Object>latitude<float> Latitude between -90 and 90.longitude<float> Longitude between -180 and 180.accuracy?<float> Non-negative accuracy value. Defaults to0.
async method: BrowserContext.setHTTPCredentials
Added in: v1.8
Languages: JavaScript
⚠️ Deprecated. Browsers may cache credentials after successful authentication. Create a new browser context instead.
param: BrowserContext.setHTTPCredentials.httpCredentials
Added in: v1.8
httpCredentials<null|Object>username<string>password<string>
async method: BrowserContext.setOffline
Added in: v1.8
param: BrowserContext.setOffline.offline
Added in: v1.8
offline<boolean>
Whether to emulate network being offline for the browser context.
async method: BrowserContext.storageState
Added in: v1.8 Returns:
Object
cookies<Array<Object>>name<string>value<string>domain<string>path<string>expires<float> Unix time in seconds.httpOnly<boolean>secure<boolean>sameSite<SameSiteAttribute<"Strict"|"Lax"|"None">>
origins<Array<Object>>origin<string>localStorage<Array<Object>>name<string>value<string>
Returns storage state for this browser context, contains current cookies, local storage snapshot and IndexedDB snapshot.
async method: BrowserContext.storageState
Added in: v1.8
Languages: C#, Java Returns:
string
option: BrowserContext.storageState.path = %%-storagestate-option-path-%%
Added in: v1.8
option: BrowserContext.storageState.indexedDB
Added in: v1.51
indexedDB?
Set to true to include IndexedDB in the storage state snapshot.
If your application uses IndexedDB to store authentication tokens, like Firebase Authentication, enable this.
async method: BrowserContext.setStorageState
Added in: v1.59
Clears the existing cookies, local storage and IndexedDB entries for all origins and sets the new storage state.
Usage
// Load storage state from a file and apply it to the context.
await context.setStorageState('state.json');
// Load storage state from a file and apply it to the context.
context.setStorageState(Paths.get("state.json"));
# Load storage state from a file and apply it to the context.
await context.set_storage_state("state.json")
# Load storage state from a file and apply it to the context.
context.set_storage_state("state.json")
// Load storage state from a file and apply it to the context.
await context.SetStorageStateAsync("state.json");
param: BrowserContext.setStorageState.storageState = %%-js-python-context-option-storage-state-%%
Added in: v1.59
Languages: JavaScript, Python
param: BrowserContext.setStorageState.storageState = %%-csharp-java-context-option-storage-state-path-%%
Added in: v1.59
Languages: C#, Java
property: BrowserContext.tracing
Added in: v1.12
Type:
Tracing
async method: BrowserContext.unrouteAll
Added in: v1.41
Removes all routes created with BrowserContext.route() and BrowserContext.routeFromHAR().
option: BrowserContext.unrouteAll.behavior = %%-unroute-all-options-behavior-%%
Added in: v1.41
async method: BrowserContext.unroute
Added in: v1.8
Removes a route created with BrowserContext.route(). When handler is not specified, removes all routes for the url.
param: BrowserContext.unroute.url
Added in: v1.8
Languages: JavaScript
url<string|RegExp|URLPattern|function(URL):boolean>
A glob pattern, regex pattern, URL pattern, or predicate receiving URL used to register a routing with
BrowserContext.route().
param: BrowserContext.unroute.url
Added in: v1.8
Languages: Python, C#, Java
url<string|RegExp|function(URL):boolean>
A glob pattern, regex pattern, or predicate receiving URL used to register a routing with
BrowserContext.route().
param: BrowserContext.unroute.handler
Added in: v1.8
Languages: JavaScript, Python
handler?<function(Route,Request): [Promise|any]>
Optional handler function used to register a routing with BrowserContext.route().
param: BrowserContext.unroute.handler
Added in: v1.8
Languages: C#, Java
handler?<function(Route)>
Optional handler function used to register a routing with BrowserContext.route().
async method: BrowserContext.waitForCondition
Added in: v1.32
Languages: Java
The method will block until the condition returns true. All copilotbrowser events will be dispatched while the method is waiting for the condition.
Usage
Use the method to wait for a condition that depends on page events:
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);
param: BrowserContext.waitForCondition.condition
Added in: v1.32
condition<BooleanSupplier>
Condition to wait for.
option: BrowserContext.waitForCondition.timeout = %%-wait-for-function-timeout-%%
Added in: v1.32
async method: BrowserContext.waitForConsoleMessage
Added in: v1.34
Languages: Java, Python, C# Returns:
ConsoleMessage
Performs action and waits for a ConsoleMessage to be logged by in the pages in the context. If predicate is provided, it passes
ConsoleMessage value into the predicate function and waits for predicate(message) to return a truthy value.
Will throw an error if the page is closed before the BrowserContext.event('console') event is fired.
async method: BrowserContext.waitForConsoleMessage
Added in: v1.34
Languages: Python Returns:
EventContextManager<ConsoleMessage>
param: BrowserContext.waitForConsoleMessage.action = %%-csharp-wait-for-event-action-%%
Added in: v1.34
option: BrowserContext.waitForConsoleMessage.predicate
Added in: v1.34
predicate<function(ConsoleMessage):boolean>
Receives the ConsoleMessage object and resolves to truthy value when the waiting should resolve.
option: BrowserContext.waitForConsoleMessage.timeout = %%-wait-for-event-timeout-%%
Added in: v1.34
param: BrowserContext.waitForConsoleMessage.callback = %%-java-wait-for-event-callback-%%
Added in: v1.34
async method: BrowserContext.waitForEvent
Added in: v1.8
Languages: JavaScript, Python Returns:
any
Waits for event to fire and passes its value into the predicate function. Returns when the predicate returns truthy value. Will throw an error if the context closes before the event is fired. Returns the event data value.
Usage
const pagePromise = context.waitForEvent('page');
await page.getByRole('button').click();
const page = await pagePromise;
Page newPage = context.waitForPage(() -> page.getByRole(AriaRole.BUTTON).click());
async with context.expect_event("page") as event_info:
await page.get_by_role("button").click()
page = await event_info.value
with context.expect_event("page") as event_info:
page.get_by_role("button").click()
page = event_info.value
var page = await context.RunAndWaitForPageAsync(async () =>
{
await page.GetByRole(AriaRole.Button).ClickAsync();
});
async method: BrowserContext.waitForEvent
Added in: v1.8
Languages: Python Returns:
EventContextManager
param: BrowserContext.waitForEvent.event
Added in: v1.8
event<string>
Event name, same one would pass into browserContext.on(event).
param: BrowserContext.waitForEvent.optionsOrPredicate
Added in: v1.8
Languages: JavaScript
optionsOrPredicate?<function|Object>predicate<function> Receives the event data and resolves to truthy value when the waiting should resolve.timeout?<float> Maximum time to wait for in milliseconds. Defaults to0- no timeout. The default value can be changed viaactionTimeoutoption in the config, or by using the BrowserContext.setDefaultTimeout() method.
Either a predicate that receives an event or an options object. Optional.
option: BrowserContext.waitForEvent.predicate = %%-wait-for-event-predicate-%%
Added in: v1.8
option: BrowserContext.waitForEvent.timeout = %%-wait-for-event-timeout-%%
Added in: v1.8
async method: BrowserContext.waitForPage
Added in: v1.9
Languages: Java, Python, C# Returns:
Page
Performs action and waits for a new Page to be created in the context. If predicate is provided, it passes
Page value into the predicate function and waits for predicate(event) to return a truthy value.
Will throw an error if the context closes before new Page is created.
async method: BrowserContext.waitForPage
Added in: v1.9
Languages: Python Returns:
EventContextManager<Page>
param: BrowserContext.waitForPage.action = %%-csharp-wait-for-event-action-%%
Added in: v1.12
option: BrowserContext.waitForPage.predicate
Added in: v1.9
Languages: C#, Java, Python
predicate<function(Page):boolean>
Receives the Page object and resolves to truthy value when the waiting should resolve.
option: BrowserContext.waitForPage.timeout = %%-wait-for-event-timeout-%%
Added in: v1.9
param: BrowserContext.waitForPage.callback = %%-java-wait-for-event-callback-%%
Added in: v1.9
async method: BrowserContext.waitForEvent2
Added in: v1.8
Languages: Python Returns:
any
In most cases, you should use BrowserContext.waitForEvent().
Waits for given event to fire. If predicate is provided, it passes
event's value into the predicate function and waits for predicate(event) to return a truthy value.
Will throw an error if the browser context is closed before the event is fired.
param: BrowserContext.waitForEvent2.event = %%-wait-for-event-event-%%
Added in: v1.8
option: BrowserContext.waitForEvent2.predicate = %%-wait-for-event-predicate-%%
Added in: v1.8
option: BrowserContext.waitForEvent2.timeout = %%-wait-for-event-timeout-%%
Added in: v1.8