microsoft / playwright-python

Python version of the Playwright testing and automation library.
https://playwright.dev/python/
Apache License 2.0
11.51k stars 876 forks source link

[Feature] Propagate contextvars to event handlers #1816

Open nathanielobrown opened 1 year ago

nathanielobrown commented 1 year ago

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.

mxschmitt commented 1 year ago

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

chingyangtseng-houzz commented 6 months ago

+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.