diff --git a/src/gui/ALWebDriverDownloadDialog.py b/src/gui/ALWebDriverDownloadDialog.py index aaf619e..fd5f2c3 100644 --- a/src/gui/ALWebDriverDownloadDialog.py +++ b/src/gui/ALWebDriverDownloadDialog.py @@ -8,6 +8,7 @@ You may use, modify, and distribute this file under the terms of the MIT License See the LICENSE file for details. """ import threading +from pathlib import Path from typing import Optional from PySide6.QtCore import ( @@ -33,7 +34,7 @@ from PySide6.QtGui import QCloseEvent from managers.driver.WebDriverManager import ( instance as webdriverInstance, WebDriverManager, - WebDriverInfo, + WebDriverCtx, WebDriverType, WebDriverStatus ) @@ -54,12 +55,12 @@ class DownloadWorker(QThread): def __init__( self, driver_manager: WebDriverManager, - driver_info: WebDriverInfo + driver_ctx: WebDriverCtx ): super().__init__() self.__driver_manager = driver_manager - self.__driver_info = driver_info - self.__driver_path = None + self.__driver_ctx = driver_ctx + self.__driver_path: Optional[Path] = None self.__cancelled = False self.__cancel_event = threading.Event() @@ -81,7 +82,7 @@ class DownloadWorker(QThread): self.downloadCancelled.emit() return self.__driver_path = self.__driver_manager.installDriver( - self.__driver_info, + self.__driver_ctx, progress_callback=self.onProgress, cancel_event=self.__cancel_event ) @@ -140,12 +141,11 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): """ super().__init__(parent) - self.__driver_dir = driver_dir self.__driver_manager: Optional[WebDriverManager] = None self.__confirmed = False - self.__selected_driver_info: Optional[WebDriverInfo] = None - self.__driver_infos: list[WebDriverInfo] = [] + self.__selected_driver_ctx: Optional[WebDriverCtx] = None + self.__driver_ctxs: list[WebDriverCtx] = [] self.__download_thread: Optional[DownloadWorker] = None self.setupUi() @@ -153,6 +153,27 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.initializeDriverManager() self.refreshDriverList() + def closeEvent( + self, + event: QCloseEvent + ): + + if self.__download_thread and self.__download_thread.isRunning(): + reply = QMessageBox.question( + self, + "确认关闭 - AutoLibrary", + "驱动正在下载中, 确定要取消并关闭对话框吗 ?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + ) + if reply == QMessageBox.StandardButton.No: + event.ignore() + return + self.__download_thread.stop() + if not self.__confirmed: + self.__selected_driver_ctx = None + event.accept() + super().closeEvent(event) + def setupUi( self ): @@ -246,89 +267,42 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): if not self.__driver_manager: return self.__driver_manager.refresh() - self.__driver_infos = self.__driver_manager.getDriverInfos() + self.__driver_ctxs = self.__driver_manager.getDriverCtxs() self.DriverComboBox.clear() installed = 0 installed_idx = 0 - for i, driver_info in enumerate(self.__driver_infos): - display_text = f"{driver_info.driver_type.value} - {driver_info.browser_version}" - if driver_info.driver_status == WebDriverStatus.INSTALLED: + for i, driver_ctx in enumerate(self.__driver_ctxs): + display_text = f"{driver_ctx.driver_type.value} - {driver_ctx.browser_version}" + if driver_ctx.driver_status == WebDriverStatus.INSTALLED: installed += 1 installed_idx = i # get the installed driver index - display_text += " : 已安装" + display_text += " - 已安装" self.DriverComboBox.addItem(display_text) - count = len(self.__driver_infos) + count = len(self.__driver_ctxs) self.BrowserCountLabel.setText(f"检测到 {count} 个可用浏览器,{installed} 个已安装驱动:") - if self.__driver_infos: + if self.__driver_ctxs: self.DriverComboBox.setCurrentIndex(installed_idx) - def onDriverComboBoxChanged( - self, - index: int - ): - - if not self.__driver_infos or index < 0 or index >= len(self.__driver_infos): - return - driver_info = self.__driver_infos[index] - self.updateDriverInfoDisplay(driver_info) - self.updateProgressBarStates(driver_info) - self.updateButtonStates(driver_info) - - def closeEvent( - self, - event: QCloseEvent - ): - - if self.__download_thread and self.__download_thread.isRunning(): - reply = QMessageBox.question( - self, - "确认关闭 - AutoLibrary", - "驱动正在下载中, 确定要取消并关闭对话框吗 ?", - QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - ) - if reply == QMessageBox.StandardButton.No: - event.ignore() - return - self.__download_thread.stop() - if not self.__confirmed: - self.__selected_driver_info = None - event.accept() - super().closeEvent(event) - - def onThreadFinished( - self - ): - - if self.__download_thread: - self.__download_thread.deleteLater() - self.__download_thread = None - - def getSelectedDriverInfo( - self - ) -> Optional[WebDriverInfo]: - - return self.__selected_driver_info - def updateDriverInfoDisplay( self, - driver_info: WebDriverInfo + driver_ctx: WebDriverCtx ): - if driver_info.driver_type == WebDriverType.CHROME: + if driver_ctx.driver_type == WebDriverType.CHROME: driver_type = "Google Chrome" - elif driver_info.driver_type == WebDriverType.FIREFOX: + elif driver_ctx.driver_type == WebDriverType.FIREFOX: driver_type = "Mozilla Firefox" - elif driver_info.driver_type == WebDriverType.EDGE: + elif driver_ctx.driver_type == WebDriverType.EDGE: driver_type = "Microsoft Edge" else: driver_type = "未知" self.BrowserTypeLabel.setText(f"类型:{driver_type}") - self.VersionLabel.setText(f"版本:{driver_info.driver_version}") - if driver_info.driver_path: - self.PathLabel.setText(str(driver_info.driver_path)) + self.VersionLabel.setText(f"版本:{driver_ctx.driver_version}") + if driver_ctx.driver_path: + self.PathLabel.setText(str(driver_ctx.driver_path)) else: self.PathLabel.setText("未安装") - match driver_info.driver_status: + match driver_ctx.driver_status: case WebDriverStatus.NOT_INSTALLED: self.StatusLabel.status = ALStatusLabel.Status.WAITING case WebDriverStatus.INSTALLED: @@ -340,51 +314,70 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): def updateProgressBarStates( self, - driver_info: WebDriverInfo + driver_ctx: WebDriverCtx ): - if driver_info.driver_status == WebDriverStatus.NOT_INSTALLED: + if driver_ctx.driver_status == WebDriverStatus.NOT_INSTALLED: self.ProgressBar.setValue(0) self.ProgressText.setText("未安装") - elif driver_info.driver_status == WebDriverStatus.INSTALLED: + elif driver_ctx.driver_status == WebDriverStatus.INSTALLED: self.ProgressBar.setValue(100) self.ProgressText.setText("已安装") - elif driver_info.driver_status == WebDriverStatus.DOWNLOADING: + elif driver_ctx.driver_status == WebDriverStatus.DOWNLOADING: pass # update by worker thread - elif driver_info.driver_status == WebDriverStatus.ERROR: + elif driver_ctx.driver_status == WebDriverStatus.ERROR: self.ProgressBar.setValue(0) self.ProgressText.setText("下载失败") def updateButtonStates( self, - driver_info: WebDriverInfo + driver_ctx: WebDriverCtx ): - if driver_info.driver_status == WebDriverStatus.NOT_INSTALLED: + if driver_ctx.driver_status == WebDriverStatus.NOT_INSTALLED: self.RefreshButton.setEnabled(True) self.DeleteButton.setEnabled(False) self.DownloadButton.setEnabled(True) self.CancelButton.setEnabled(True) self.ConfirmButton.setEnabled(False) - elif driver_info.driver_status == WebDriverStatus.INSTALLED: + elif driver_ctx.driver_status == WebDriverStatus.INSTALLED: self.RefreshButton.setEnabled(True) self.DownloadButton.setEnabled(False) self.DeleteButton.setEnabled(True) self.CancelButton.setEnabled(True) self.ConfirmButton.setEnabled(True) - elif driver_info.driver_status == WebDriverStatus.DOWNLOADING: + elif driver_ctx.driver_status == WebDriverStatus.DOWNLOADING: self.RefreshButton.setEnabled(False) self.DownloadButton.setEnabled(False) self.DeleteButton.setEnabled(False) self.CancelButton.setEnabled(True) self.ConfirmButton.setEnabled(False) - elif driver_info.driver_status == WebDriverStatus.ERROR: + elif driver_ctx.driver_status == WebDriverStatus.ERROR: self.RefreshButton.setEnabled(True) self.DownloadButton.setEnabled(True) self.DeleteButton.setEnabled(False) self.CancelButton.setEnabled(True) self.ConfirmButton.setEnabled(False) + def getSelectedDriverInfo( + self + ) -> Optional[WebDriverCtx]: + + return self.__selected_driver_ctx + + @Slot(int) + def onDriverComboBoxChanged( + self, + index: int + ): + + if not self.__driver_ctxs or index < 0 or index >= len(self.__driver_ctxs): + return + driver_ctx = self.__driver_ctxs[index] + self.updateDriverInfoDisplay(driver_ctx) + self.updateProgressBarStates(driver_ctx) + self.updateButtonStates(driver_ctx) + @Slot() def onRefreshButtonClicked( self @@ -398,9 +391,9 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): ): index = self.DriverComboBox.currentIndex() - if index < 0 or index >= len(self.__driver_infos): + if index < 0 or index >= len(self.__driver_ctxs): return - driver_info = self.__driver_infos[index] + driver_info = self.__driver_ctxs[index] if driver_info.driver_status.name != "INSTALLED": QMessageBox.information(self, "提示 - AutoLibrary", "该驱动未安装, 无需删除") return @@ -426,9 +419,9 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.DriverComboBox.setEnabled(False) index = self.DriverComboBox.currentIndex() - if index < 0 or index >= len(self.__driver_infos): + if index < 0 or index >= len(self.__driver_ctxs): return - driver_info = self.__driver_infos[index] + driver_info = self.__driver_ctxs[index] if driver_info.driver_status == WebDriverStatus.INSTALLED: return driver_info.driver_status = WebDriverStatus.DOWNLOADING # we set this only to update @@ -444,7 +437,7 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.__download_thread.downloadFinished.connect(self.onDownloadFinished) self.__download_thread.downloadError.connect(self.onDownloadError) self.__download_thread.downloadCancelled.connect(self.onDownloadCancelled) - self.__download_thread.finished.connect(self.onThreadFinished) + self.__download_thread.finished.connect(self.onDownloadThreadFinished) self.__download_thread.start() @Slot() @@ -472,8 +465,8 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.DriverComboBox.setEnabled(True) index = self.DriverComboBox.currentIndex() - if 0 <= index < len(self.__driver_infos): - driver_info = self.__driver_infos[index] + if 0 <= index < len(self.__driver_ctxs): + driver_info = self.__driver_ctxs[index] driver_info.driver_status = WebDriverStatus.INSTALLED self.updateDriverInfoDisplay(driver_info) self.updateProgressBarStates(driver_info) @@ -487,8 +480,8 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.DriverComboBox.setEnabled(True) index = self.DriverComboBox.currentIndex() - if 0 <= index < len(self.__driver_infos): - driver_info = self.__driver_infos[index] + if 0 <= index < len(self.__driver_ctxs): + driver_info = self.__driver_ctxs[index] driver_info.driver_status = WebDriverStatus.ERROR self.updateDriverInfoDisplay(driver_info) self.updateProgressBarStates(driver_info) @@ -502,8 +495,8 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.DriverComboBox.setEnabled(True) index = self.DriverComboBox.currentIndex() - if 0 <= index < len(self.__driver_infos): - driver_info = self.__driver_infos[index] + if 0 <= index < len(self.__driver_ctxs): + driver_info = self.__driver_ctxs[index] self.__driver_manager.cancelDriverDownload(driver_info) driver_info.driver_status = WebDriverStatus.NOT_INSTALLED self.updateDriverInfoDisplay(driver_info) @@ -511,18 +504,27 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.updateButtonStates(driver_info) self.ProgressText.setText("下载已取消") + @Slot() + def onDownloadThreadFinished( + self + ): + + if self.__download_thread: + self.__download_thread.deleteLater() + self.__download_thread = None + @Slot() def onConfirmButtonClicked( self ): index = self.DriverComboBox.currentIndex() - if index < 0 or index >= len(self.__driver_infos): + if index < 0 or index >= len(self.__driver_ctxs): return - driver_info = self.__driver_infos[index] - if driver_info.driver_status != WebDriverStatus.INSTALLED: + driver_ctx = self.__driver_ctxs[index] + if driver_ctx.driver_status != WebDriverStatus.INSTALLED: return - self.__selected_driver_info = driver_info + self.__selected_driver_ctx = driver_ctx self.__confirmed = True self.accept() @@ -542,5 +544,5 @@ class ALWebDriverDownloadDialog(CenterOnParentMixin, QDialog): self.__download_thread.cancel() else: self.__confirmed = False - self.__selected_driver_info = None + self.__selected_driver_ctx = None self.reject() diff --git a/src/managers/driver/WebDriverDownloader.py b/src/managers/driver/WebDriverDownloader.py index 681d9c8..af11ae7 100644 --- a/src/managers/driver/WebDriverDownloader.py +++ b/src/managers/driver/WebDriverDownloader.py @@ -181,7 +181,7 @@ class WebDriverFileName: raise ValueError(f"不受支持的 web driver 类型 : {self.driver_type}") -class WebDriverURL: +class WebDriverDownloadURL: """ Web driver download URL """ @@ -242,7 +242,7 @@ class WebDriverDownloader: self.driver_type = driver_type self.arch = driver_arch self.version = driver_version - self.download_url = str(WebDriverURL(self.version, self.driver_type, self.arch)) + self.download_url = str(WebDriverDownloadURL(self.version, self.driver_type, self.arch)) self.download_dir = Path(download_dir)/self.driver_type.value/self.version/self.arch.value self.download_dir.mkdir(mode=0o0755, parents=True, exist_ok=True) self.download_path = self.download_dir/str(WebDriverFileName(self.version, self.driver_type, self.arch)) diff --git a/src/managers/driver/WebDriverManager.py b/src/managers/driver/WebDriverManager.py index 7ab845d..3974255 100644 --- a/src/managers/driver/WebDriverManager.py +++ b/src/managers/driver/WebDriverManager.py @@ -8,6 +8,7 @@ You may use, modify, and distribute this file under the terms of the MIT License See the LICENSE file for details. """ import os +import shutil import threading import packaging.version as ver @@ -19,7 +20,7 @@ from managers.driver.WebBrowserDetector import ( WebBrowserType, WebBrowserArch, WebBrowserInfo, WebBrowserDetector ) from managers.driver.WebDriverDownloader import ( - WebDriverArch, WebDriverType, + WebDriverArch, WebDriverType, WebDriverExecName, ChromeDriverDownloader, FirefoxDriverDownloader, EdgeDriverDownloader ) @@ -35,9 +36,9 @@ class WebDriverStatus(Enum): ERROR = 3 -class WebDriverInfo: +class WebDriverCtx: """ - Web driver information. + Web browser and driver context. Attributes: driver_type (WebDriverType): Web driver type @@ -52,8 +53,8 @@ class WebDriverInfo: self ): - self.driver_type = None - self.driver_arch = None + self.driver_type : Optional[WebDriverType] = None + self.driver_arch : Optional[WebDriverArch] = None self.driver_version = "" self.browser_version = "" self.driver_path: Optional[Path] = None @@ -75,7 +76,7 @@ class WebDriverManager: self.__driver_dir = os.path.abspath(driver_dir) self.__browser_detector = WebBrowserDetector() - self.__driver_infos: list[WebDriverInfo] = [] + self.__driver_ctxs: list[WebDriverCtx] = [] self.__initialized = False self.__lock = threading.Lock() @@ -98,7 +99,7 @@ class WebDriverManager: with self.__lock: browser_infos = self.__browser_detector.detect() - self.__driver_infos = [ + self.__driver_ctxs = [ self._getDriverInfo(info) for info in browser_infos ] @@ -108,7 +109,7 @@ class WebDriverManager: ): with self.__lock: - for driver_info in self.__driver_infos: + for driver_info in self.__driver_ctxs: driver_path = self._getDriverPath(driver_info) if driver_path and driver_path.exists() and driver_path.is_file(): # Repair missing execute permission on Unix @@ -198,7 +199,7 @@ class WebDriverManager: else: raise ValueError(f"不支持的 Web 浏览器类型 : {browser_type}") - def _mapFirefoxDriverVersion( + def _mapFirefoxBrowserVersionToDriver( self, version: str ) -> str: @@ -241,43 +242,27 @@ class WebDriverManager: def _getDriverInfo( self, browser_info: WebBrowserInfo - ) -> WebDriverInfo: + ) -> WebDriverCtx: - driver_info = WebDriverInfo() - driver_info.driver_type = self._mapWebBrowserTypeToDriver(browser_info.browser_type) - driver_info.driver_arch = self._mapWebBrowserArchToDriver(browser_info.browser_type, browser_info.browser_arch) + driver_ctx = WebDriverCtx() + driver_ctx.driver_type = self._mapWebBrowserTypeToDriver(browser_info.browser_type) + driver_ctx.driver_arch = self._mapWebBrowserArchToDriver(browser_info.browser_type, browser_info.browser_arch) if browser_info.browser_type == WebBrowserType.FIREFOX: - driver_info.driver_version = self._mapFirefoxDriverVersion(browser_info.browser_version) + driver_ctx.driver_version = self._mapFirefoxBrowserVersionToDriver(browser_info.browser_version) else: - driver_info.driver_version = browser_info.browser_version - driver_info.browser_version = browser_info.browser_version - return driver_info + driver_ctx.driver_version = browser_info.browser_version + driver_ctx.browser_version = browser_info.browser_version + return driver_ctx def _getDriverPath( self, - driver_info: WebDriverInfo + driver_ctx: WebDriverCtx ) -> Optional[Path]: - driver_type = driver_info.driver_type - driver_arch = driver_info.driver_arch - driver_version = driver_info.driver_version - if driver_type == WebDriverType.CHROME: - driver_name = "chromedriver" - elif driver_type == WebDriverType.FIREFOX: - driver_name = "geckodriver" - elif driver_type == WebDriverType.EDGE: - driver_name = "msedgedriver" - else: - return None - is_win = driver_arch in [ - WebDriverArch.Chrome.WINX86_32, - WebDriverArch.Chrome.WINX86_64, - WebDriverArch.Firefox.WINX86_32, - WebDriverArch.Firefox.WINX86_64, - WebDriverArch.Edge.WINX86_32, - WebDriverArch.Edge.WINX86_64, - ] - exe_name = f"{driver_name}.exe" if is_win else driver_name + driver_type = driver_ctx.driver_type + driver_arch = driver_ctx.driver_arch + driver_version = driver_ctx.driver_version + exe_name = str(WebDriverExecName(driver_type, driver_arch)) driver_dir = Path(self.__driver_dir)/driver_type.value/driver_version/driver_arch.value driver_path = driver_dir/exe_name return driver_path @@ -289,28 +274,28 @@ class WebDriverManager: self._detectBrowsers() self._checkDriverStatus() - def getDriverInfos( + def getDriverCtxs( self - ) -> list[WebDriverInfo]: + ) -> list[WebDriverCtx]: with self.__lock: - return self.__driver_infos.copy() + return self.__driver_ctxs.copy() - def getDriverInfo( + def getDriverCtx( self, driver_type: WebDriverType - ) -> list[WebDriverInfo]: + ) -> list[WebDriverCtx]: with self.__lock: return [ info - for info in self.__driver_infos + for info in self.__driver_ctxs if info.driver_type == driver_type ] def getDriverPath( self, - driver_info: WebDriverInfo + driver_info: WebDriverCtx ) -> Optional[Path]: if driver_info and driver_info.driver_status == WebDriverStatus.INSTALLED: @@ -319,28 +304,28 @@ class WebDriverManager: def installDriver( self, - driver_info: WebDriverInfo, + driver_ctx: WebDriverCtx, progress_callback: Optional[Callable[[float, int, float, str], None]] = None, cancel_event: Optional[threading.Event] = None ) -> Optional[Path]: with self.__lock: - if not driver_info: + if not driver_ctx: if progress_callback: progress_callback(0, 0, 0, "未找到浏览器信息") else: raise ValueError("未找到浏览器信息") - if driver_info and driver_info.driver_status == WebDriverStatus.DOWNLOADING: + if driver_ctx and driver_ctx.driver_status == WebDriverStatus.DOWNLOADING: if progress_callback: - progress_callback(0, 0, 0, f"{driver_info.driver_type} 驱动正在下载中") + progress_callback(0, 0, 0, f"{driver_ctx.driver_type} 驱动正在下载中") else: - raise ValueError(f"{driver_info.driver_type} 驱动正在下载中") + raise ValueError(f"{driver_ctx.driver_type} 驱动正在下载中") try: - if not driver_info: + if not driver_ctx: raise ValueError("未找到浏览器信息") - driver_arch = driver_info.driver_arch - driver_type = driver_info.driver_type - driver_version = driver_info.driver_version + driver_arch = driver_ctx.driver_arch + driver_type = driver_ctx.driver_type + driver_version = driver_ctx.driver_version downloader = None if driver_type == WebDriverType.CHROME: downloader = ChromeDriverDownloader( @@ -366,68 +351,66 @@ class WebDriverManager: else: raise ValueError(f"不支持的 Web Driver 类型") with self.__lock: - driver_info.driver_status = WebDriverStatus.DOWNLOADING + driver_ctx.driver_status = WebDriverStatus.DOWNLOADING driver_path = downloader.download(progress_callback=progress_callback, cancel_event=cancel_event) with self.__lock: if driver_path: - driver_info.driver_path = driver_path - driver_info.driver_version = driver_version - driver_info.driver_status = WebDriverStatus.INSTALLED + driver_ctx.driver_path = driver_path + driver_ctx.driver_version = driver_version + driver_ctx.driver_status = WebDriverStatus.INSTALLED else: - driver_info.driver_status = WebDriverStatus.ERROR + driver_ctx.driver_status = WebDriverStatus.ERROR return driver_path except Exception as e: with self.__lock: - driver_info.driver_status = WebDriverStatus.ERROR + driver_ctx.driver_status = WebDriverStatus.ERROR raise e def cancelDriverDownload( self, - driver_info: WebDriverInfo + driver_ctx: WebDriverCtx ) -> bool: - import shutil - try: - driver_path = self._getDriverPath(driver_info) + driver_path = self._getDriverPath(driver_ctx) if driver_path: download_dir = driver_path.parent if download_dir.exists(): shutil.rmtree(download_dir, ignore_errors=True) with self.__lock: - driver_info.driver_path = None - driver_info.driver_status = WebDriverStatus.NOT_INSTALLED + driver_ctx.driver_path = None + driver_ctx.driver_status = WebDriverStatus.NOT_INSTALLED return True except Exception: return False def uninstallDriver( self, - driver_info: WebDriverInfo, + driver_ctx: WebDriverCtx, progress_callback: Optional[Callable[[int, int, float, str], None]] = None ) -> bool: with self.__lock: - if not driver_info: + if not driver_ctx: if progress_callback: progress_callback(0, 0, 0, "未找到浏览器信息") else: raise ValueError("未找到浏览器信息") - if driver_info.driver_status != WebDriverStatus.INSTALLED: + if driver_ctx.driver_status != WebDriverStatus.INSTALLED: if progress_callback: - progress_callback(0, 0, 0, f"{driver_info.driver_type} 驱动未安装") + progress_callback(0, 0, 0, f"{driver_ctx.driver_type} 驱动未安装") else: - raise ValueError(f"{driver_info.driver_type} 驱动未安装") + raise ValueError(f"{driver_ctx.driver_type} 驱动未安装") try: - driver_path = driver_info.driver_path + driver_path = driver_ctx.driver_path driver_path.unlink() with self.__lock: - driver_info.driver_path = None - driver_info.driver_status = WebDriverStatus.NOT_INSTALLED + driver_ctx.driver_path = None + driver_ctx.driver_status = WebDriverStatus.NOT_INSTALLED return True except Exception: with self.__lock: - driver_info.driver_status = WebDriverStatus.ERROR + driver_ctx.driver_status = WebDriverStatus.ERROR raise def driverDir(