无法在使用Python的播放权测试中捕获浏览器错误日志

问题描述 投票:0回答:1

我正在用 python w/ playright + pytest 编写功能测试。我正在编写一个测试来识别浏览器日志中的任何错误。

不过我似乎无法获取日志的内容。由于某种原因,代码似乎没有按正确的顺序加载。我知道存在错误,但在我尝试捕获它们的地方,它返回 None。

下面是我的代码:

@pytest.mark.django_db(transaction=True)
def test_can_load_pages_without_error(login_to_myscore):
    # login
    page = login_to_myscore
    # Retrieve testing objects
    testing_objects = get_testing_objects('all')
    # load up the page for each object
    for object in tqdm(testing_objects):
        url = page.goto(f'http://localhost:{local_port}/production/{str(object.slug)}')
        # check for errors
        can_load_page_without_errors(url, page)

这会调用以下函数:

def can_load_page_without_errors(url, page):

    print("THE URL: ", url)

    # page.on("console", lambda msg: print(f"A1: {msg.text}") if msg.type == "error" else None)
    # page.on("console", lambda msg: print(f"A2:{msg.text}"))

    page.on("pageerror", lambda exc: print(f"1: {exc}"))

    page.on("pageerror", lambda err: print(f"2: {err.message}"))

    # check for any uncaught errors logged to browser console
    uncaught_errors = []
    # uncaught_error = page.on("pageerror", lambda error: error)

    # Define a function to handle the pageerror event
    def handle_pageerror(error):
        print("3", error)
        print("4", type(error))
        error = str(error)
        print("5", type(error))
        return error

    # Attach the function to the pageerror event
    uncaught_error = page.on("pageerror", handle_pageerror)
    uncaught_errors.append(uncaught_error)
    print("6", uncaught_error)
    print("7", uncaught_errors)
    # assert len(uncaught_errors) == 0, f"The following uncaught JavaScript errors were reported for {url}:\n{uncaught_error}"

以下是打印顺序:

URL:  http://localhost:8080/production/1538
6 None
7 [None]
1: overflows is not defined
2: overflows is not defined
3 overflows is not defined
4 <class 'playwright._impl._errors.Error'>
5 <class 'str'>

您会注意到,出于某种原因,(6) 和 (7) 首先打印......结果为 None。但是错误打印在(1),(2),(3)...

为什么要这样做?

我认为 Playwright 应该能够更好地处理等待内容(这是我选择它而不是 Selenium 的一个重要原因)。我尝试了很多方法来延迟页面加载,但这似乎没有什么区别,所以也许不是这样......?

我只想能够获取 page.on("console") 和 page.on("pageerror") 的结果,但由于函数渲染/加载的方式,我似乎无法做到这一点(乱序)。

关于为什么/如何做到这一点有什么想法吗?

谢谢您!

pytest integration-testing playwright playwright-python playwright-test
1个回答
0
投票

对于遇到这种情况的其他人,解决方案是在加载网页之前放置事件处理程序 (page.on())!

    # build the URL of our page
    url = f'http://localhost:{local_port}/{app}/{str(object.slug)}'
    print(" PAGE URL: ", url)

    # append any uncaught javascript errors in browser error logs to list
    uncaught_errors = []
    page.on("pageerror", lambda exc: uncaught_errors.append(exc))

    # append any javascript errors in browser error logs to list
    error_logs = []
    page.on("console", lambda msg: error_logs.append(msg.text) if msg.type == "error" else None)

    # go to page once there are no more than 2 network connections for at least 500 milliseconds
    page.goto(url, wait_until="networkidle")

    # assert that 'Page Not Found' is not in title tag of DOM
    title = page.title()
    assert 'Page Not Found' not in title, '\n\n 404 error!'

    # assert that no uncaught javascript errors are in browser error logs
    assert len(uncaught_errors) == 0, f"The following uncaught JavaScript errors were reported for {url}:\n{uncaught_errors}"

    # assert that no javascript errors are in browser error logs
    assert len(error_logs) == 0, f"The following JavaScript errors were reported for {url}:\n{error_logs}"
© www.soinside.com 2019 - 2024. All rights reserved.