playwright-python icon indicating copy to clipboard operation
playwright-python copied to clipboard

[Feature] Propagate contextvars to event handlers

Open nathanielobrown opened this issue 2 years ago • 2 comments

When using the Playwright Python library, event callbacks registered with page.on() do not have the same contextvars as the parent code. This behavior can lead to issues when users expect shared context between the main code and event handlers.

It would be great if Playwright could propagate contextvars to event handlers by default to facilitate shared context.

Reproduction Code Sample:

This code demonstrates failure to get context var. Tested on Python 3.10, Playwright versions 1.31 and 1.29

import contextvars
from playwright.sync_api import sync_playwright

shared_var = contextvars.ContextVar("shared_var")

def on_request(request):
    try:
        print("Shared value in callback:", shared_var.get())
    except LookupError:
        print("Failed to get shared value in callback")

def main():
    shared_var.set("some value")

    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()

        page.on("request", on_request)

        # Perform some actions and trigger the event
        page.goto("https://example.com")
        browser.close()

if __name__ == "__main__":
    main()

Context

This came up for me because I used context managers to annotate logs but my logging of network requests in Playwright were not getting annotated.

nathanielobrown avatar Mar 17 '23 12:03 nathanielobrown

Investigation note, we need to implement this greenlet functionality accordingly around here.

mxschmitt avatar Mar 21 '23 10:03 mxschmitt

+1 for this. I would like to implement similar feature to consolidate the logs under the same session/request through the same id stored within the contextvars.

chingyangtseng-houzz avatar Feb 20 '24 06:02 chingyangtseng-houzz