99 lines
3.4 KiB
Python
99 lines
3.4 KiB
Python
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())
|