import asyncio import sys from playwright.async_api import async_playwright, Browser, BrowserContext, Page from PySide6.QtCore import Qt, QObject, QRunnable, QThreadPool, Signal from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QCheckBox, QTextEdit) class PlaywrightWorker(QObject, QRunnable): finished = Signal(str) def __init__(self, url): super().__init__() self.url = url self.setAutoDelete(True) def run(self): try: asyncio.set_event_loop(asyncio.new_event_loop()) # 중요: 새로운 이벤트 루프 설정 loop = asyncio.get_event_loop() loop.run_until_complete(self.run_playwright()) # loop 인자 제거 loop.close() except Exception as e: print(f"PlaywrightWorker Error: {e}") # 에러 자세히 출력 self.finished.emit(str(e)) async def run_playwright(self): async with async_playwright() as p: browser: Browser = await p.chromium.launch(headless=False) context: BrowserContext = await browser.new_context() page: Page = await context.new_page() try: await page.goto(self.url) print("Page navigation successful!") # 성공 메시지 출력 except Exception as e: print(f"Page navigation failed: {e}") # 에러 자세히 출력 raise # 예외를 다시 발생시켜 상위에서 처리 finally: await asyncio.gather(page.close(), context.close(), browser.close()) print("Browser closed successfully!") # 성공 메시지 출력 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Playwright Web Automation") self.threadpool = QThreadPool() self.create_layout() def create_layout(self): # Input fields url_label = QLabel("URL:") self.url_input = QLineEdit() self.url_input.setText("https://www.naver.com") #Default URL # Button self.go_button = QPushButton("Go") self.go_button.clicked.connect(self.start_playwright) # Log output self.log_output = QTextEdit() self.log_output.setReadOnly(True) # Layout main_layout = QVBoxLayout() main_layout.addWidget(url_label) main_layout.addWidget(self.url_input) main_layout.addWidget(self.go_button) main_layout.addWidget(self.log_output) central_widget = QWidget() central_widget.setLayout(main_layout) self.setCentralWidget(central_widget) def start_playwright(self): url = self.url_input.text() worker = PlaywrightWorker(url) worker.finished.connect(self.on_playwright_finished) self.threadpool.start(worker) def on_playwright_finished(self, error_message=""): if error_message: self.log_output.append(f"Error: {error_message}") # 에러 메시지 자세히 출력 else: self.log_output.append("Playwright task finished successfully.") def closeEvent(self, event): self.threadpool.waitForDone() self.log_output.append("Application closing...") event.accept() if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())