我正在用 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") 的结果,但由于函数渲染/加载的方式,我似乎无法做到这一点(乱序)。
关于为什么/如何做到这一点有什么想法吗?
谢谢您!
对于遇到这种情况的其他人,解决方案是在加载网页之前放置事件处理程序 (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}"