微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

(Python) 函数装饰器将 Playwright Page 对象传递给包装函数

如何解决(Python) 函数装饰器将 Playwright Page 对象传递给包装函数

目标:我正在尝试创建一个函数装饰器,它将 Playwright Page(playwright.sync_api._generated.Page) 对象传递给包装的函数

问题:对于大多数函数调用,我将能够返回函数调用返回的值。但是,由于 Playwright 需要 browser.close() 调用,我不能简单地返回 Page 对象。我不确定问题出在 (1) 我定义的函数装饰器,还是 (2) 我对函数装饰器的使用。

我尝试在 pytest 固定装置之后为我的装饰器建模。使用 pytest,我会做这样的事情:

@pytest.fixture(scope="module")
def playwright_page():
    with sync_playwright() as play:
        browser = play.chromium.launch()
        page = browser.new_page()
        yield page
        browser.close()

然后

def open_google(playwright_page):
    playwright_page.goto("https://google.com")

函数装饰器

>>> from playwright.sync_api import sync_playwright
>>> def playwright_page(func):
        def wrapper(*args,**kwargs):
            with sync_playwright() as play:
                browser = play.chromium.launch()
                page = browser.new_page()
                yield page
                browser.close()
        return wrapper

尝试 1

>>> @playwright_page
def open_google():
    page.goto("https://google.com")

    
>>> open_google()
<generator object playwright_page.<locals>.wrapper at 0x0000015C5F6CBC10>

尝试 2

>>> @playwright_page
    def open_google():
        page = next(page)
        page.goto("https://google.com")

    
>>> open_google()
<generator object playwright_page.<locals>.wrapper at 0x0000015C5fdb7F90>

解决方法

我应该调用 Page 并传递 pytest 对象,而不是尝试产生 func 对象,例如 Page 固定装置。

>>> from playwright.sync_api import sync_playwright
>>> def playwright_page(func):
        def wrapper():
            with sync_playwright() as play:
                browser = play.chromium.launch()
                page = browser.new_page()
                results = func(page)
                browser.close()
                return results
        return wrapper


>>> @playwright_page
    def open_google(page):
        page.goto("https://google.com")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。