Я получаю ошибку разрешения, когда пытаюсь удалить файл, но только если скрипт python ранее отключил предупреждение об общем контексте потерянного интерфейса.
Вот сообщения об ошибках:
ERROR:gpu_process_transport_factory.cc(1016)] Lost UI shared context.
PermissionError: [WinError 32] The process cannot access the file
because it is being used by another process
Интересно, что при появлении сообщения с предупреждением об общем контексте потерянного пользовательского интерфейса селен, кажется, автоматически создает экземпляр окон Chrome - когда я запускаю его на переднем плане, создается новое окно для каждого предупреждения об общем контексте потерянного пользовательского интерфейса, и потерянные окна сохраняются,Я не создаю явно новые окна Chrome, какой-то другой процесс, предположительно, селен или драйвер хрома.
Я предполагаю, что каким-то образом файл, который я не могу удалить, прикреплен к одному из потерянных процессов, но я могу 'Кажется, я не могу понять, как его отключить, чтобы я мог удалить его, что мне нужно сделать для того, чтобы мой код заработал.
Решение предупреждения об общем контексте потерянного интерфейса пользователя не важно для меня, только потому, что оно можетбыть причиной ошибки разрешения.
Здесь происходит сбой кода с PermissionError в os.remove(f)
:
# downloading file - first clear download folder
clearfolder(downloadfolder)
xpath = "xpath-of-the-file-i-want-to-download"
button = getbutton(self.driver, xpath)
# make sure element is visible
self.driver.execute_script("return arguments[0].scrollIntoView(true);", button)
time.sleep(2)
button.click()
time.sleep(2)
# get name of downloaded file - there should only be one file in the download folder
files = []
for (dirpath, dirnames, filenames) in os.walk(self.downloadfolder):
files.extend(filenames)
break
self.logger.debug('Files in directory:\n{}'.format(files))
if len(files) != 1:
self.logger.warning('Single file condition not satisfied with {} files present'.format(len(files)))
return 1, []
else:
self.logger.debug('Reading excel file')
f = os.path.join(self.downloadfolder, files[0])
excelfile = pd.ExcelFile(f)
df = excelfile.parse(header=[0,1],index_col=None)
excelfile.close()
self.logger.debug('Deleting excel file')
time.sleep(1)
# I tried to see if chmod could change the permissions so I could delete the file - it did not affect the error
self.logger.debug('chmod')
os.chmod(f, stat.S_IWRITE)
time.sleep(1)
os.remove(f)
self.logger.debug('Done deleting excel file')
А здесь создается драйвер хрома селена, который совпадаетс тем, где появляется предупреждение общего контекста Lost UI, по-видимому, прямо при определении драйвера - driver = webdriver.Chrome
:
capabilities = DesiredCapabilities.CHROME.copy()
# this lets get load page without waiting
capabilities['pageLoadStrategy'] = 'none'
options = webdriver.ChromeOptions()
options.add_argument('--start-maximized')
options.add_argument('--no-proxy-server')
options.add_argument('--disable-extensions')
#options.add_argument('--disable-gpu')
options.add_argument('--dns-prefetch-disable')
options.add_argument('--lang=en_US')
options.add_argument('--disable-popup-blocking')
prefs = {"profile.default_content_settings.popups": 0,
"platform": "WINDOWS",
"download.default_directory": downloadfolder,
"directory_upgrade": True,
"extensions_to_open": ""}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path=driverloc, chrome_options=options, desired_capabilities=capabilities)
# not sure why but chrome sometimes takes a long time to load pages
driver.set_page_load_timeout(300)
И это метод, который используется для очистки каждого драйвера селен хрома, как только он это сделалего работа:
def killdriver(driver):
"""Kill driver. Handles the case where driver has not been instantiated"""
try:
driver
except NameError as e:
logger.warning('Kill driver - NameError {}'.format(e))
pass
except AttributeError as e:
logger.warning('Kill driver AttributeError {}'.format(e))
pass
except OSError as ConnectionRefusedError:
logger.warning('Kill driver ConnectionRefusedError')
else:
# driver exists so kill it
logger.info('Killing driver')
driver.quit()
Спасибо за любую помощь.