18
18
import sys
19
19
import warnings
20
20
from typing import Any , Callable , Dict , Generator , List , Optional
21
-
21
+ import logging
22
22
import pytest
23
23
from playwright .sync_api import (
24
24
Browser ,
33
33
import tempfile
34
34
35
35
36
+ log = logging .getLogger (__name__ )
37
+
36
38
artifacts_folder = tempfile .TemporaryDirectory (prefix = "playwright-pytest-" )
37
39
38
40
@@ -74,6 +76,34 @@ def pytest_configure(config: Any) -> None:
74
76
"markers" ,
75
77
"browser_context_args(**kwargs): provide additional arguments to browser.new_context()" ,
76
78
)
79
+ log .debug ("pytest_configure" )
80
+ class Teardown :
81
+ failed = False
82
+ setattr (config , "teardown" , Teardown )
83
+
84
+
85
+ def pytest_runtest_teardown (item ):
86
+ # import faulthandler
87
+ # faulthandler.dump_traceback(all_threads=True)
88
+ log .debug ("pytest_runtest_teardown" )
89
+ item .config .teardown .failed = True
90
+
91
+
92
+ def pytest_sessionfinish (session , exitstatus ):
93
+ log .debug ("pytest_runtest_teardown" )
94
+ log .debug (f"{ exitstatus = } " )
95
+
96
+
97
+ def pytest_exception_interact (node , call , report ):
98
+ log .debug ("1pytest_exception_interact" )
99
+ log .debug (f"{ node .config .teardown .failed = } " )
100
+ log .debug (f"{ node .session .testsfailed = } " )
101
+ excinfo = call .exc_info if hasattr (call , "exc_info" ) else None
102
+ log .debug (f"{ excinfo = } " )
103
+
104
+ if call .when == "teardown" :
105
+ log .debug ("2pytest_exception_interact" )
106
+ node .config .teardown .failed = True
77
107
78
108
79
109
# Making test result information available in fixtures
@@ -256,10 +286,52 @@ def context(
256
286
)
257
287
258
288
yield context
289
+ # import traceback
290
+ # log.debug(f"{dir(traceback)=}")
291
+ # log.debug(f"{traceback.print_last()=}")
292
+ # stack = traceback.extract_stack()
293
+ # log.debug(f"{stack=}")
294
+ # for frame_summary in stack:
295
+ # log.debug(f"{frame_summary.filename=}")
296
+ # log.debug(f"{frame_summary.name=}")
297
+ # log.debug(f"{frame_summary.colno=}")
298
+
299
+
300
+ # log.debug(f"{traceback.print_stack()=}")
259
301
302
+ # log.debug(f"{traceback.print_exc()=}")
303
+
304
+ log .debug (f"{ request .session .testscollected = } " )
305
+ log .debug (f"{ request .session .exitstatus = } " )
306
+ log .debug (f"{ request .session .testsfailed = } " )
307
+
308
+ if request .session .testsfailed :
309
+ log .debug ("Only print if failed" )
310
+
311
+ log .debug ("context" )
260
312
# If request.node is missing rep_call, then some error happened during execution
261
313
# that prevented teardown, but should still be counted as a failure
262
- failed = request .node .rep_call .failed if hasattr (request .node , "rep_call" ) else True
314
+ failed_setup = request .node .rep_setup .failed if hasattr (request .node , "rep_setup" ) else False
315
+ failed_call = request .node .rep_call .failed if hasattr (request .node , "rep_call" ) else False
316
+ failed_teardown = request .node .rep_teardown .failed if hasattr (request .node , "rep_teardown" ) else False
317
+
318
+ failed_xteardown = request .config .teardown .failed if hasattr (request .config , "teardown" ) else False
319
+
320
+
321
+ failed = failed_setup or failed_call or failed_xteardown
322
+ log .debug (f"{ failed = } " )
323
+ log .debug (f"{ failed_setup = } " )
324
+ log .debug (f"{ failed_call = } " )
325
+ log .debug (f"{ failed_teardown = } " )
326
+ log .debug (f"{ failed_xteardown = } " )
327
+
328
+
329
+ log .debug (f"{ hasattr (request .node , 'rep_setup' )= } " )
330
+ log .debug (f"{ hasattr (request .node , 'rep_call' )= } " )
331
+ log .debug (f"{ hasattr (request .node , 'rep_teardown' )= } " )
332
+
333
+ log .debug (f"{ hasattr (request .config , 'teardown' )= } " )
334
+
263
335
264
336
if capture_trace :
265
337
retain_trace = tracing_option == "on" or (
@@ -272,9 +344,11 @@ def context(
272
344
context .tracing .stop ()
273
345
274
346
screenshot_option = pytestconfig .getoption ("--screenshot" )
347
+ log .debug (f"{ screenshot_option = } " )
275
348
capture_screenshot = screenshot_option == "on" or (
276
349
failed and screenshot_option == "only-on-failure"
277
350
)
351
+ log .debug (f"{ capture_screenshot = } " )
278
352
if capture_screenshot :
279
353
for index , page in enumerate (pages ):
280
354
human_readable_status = "failed" if failed else "finished"
0 commit comments