diff --git a/cps/admin.py b/cps/admin.py index 1df1e8cc..453e4b66 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -985,11 +985,14 @@ def _config_string(to_save, x): def _configuration_gdrive_helper(to_save): + gdrive_error = None + gdrive_secrets = {} + if not os.path.isfile(gdriveutils.SETTINGS_YAML): config.config_use_google_drive = False - gdrive_secrets = {} - gdrive_error = gdriveutils.get_error_text(gdrive_secrets) + if gdrive_support: + gdrive_error = gdriveutils.get_error_text(gdrive_secrets) if "config_use_google_drive" in to_save and not config.config_use_google_drive and not gdrive_error: with open(gdriveutils.CLIENT_SECRETS, 'r') as settings: gdrive_secrets = json.load(settings)['web'] @@ -1254,7 +1257,7 @@ def _configuration_result(error_flash=None, gdrive_error=None, configured=True): gdrivefolders = [] if gdrive_error is None: gdrive_error = gdriveutils.get_error_text() - if gdrive_error: + if gdrive_error and gdrive_support: log.error(gdrive_error) gdrive_error = _(gdrive_error) else: diff --git a/cps/fb2.py b/cps/fb2.py index d7b03d5b..af4a29a7 100644 --- a/cps/fb2.py +++ b/cps/fb2.py @@ -29,7 +29,7 @@ def get_fb2_info(tmp_file_path, original_file_extension): 'l': 'http://www.w3.org/1999/xlink', } - fb2_file = open(tmp_file_path) + fb2_file = open(tmp_file_path, encoding="utf-8") tree = etree.fromstring(fb2_file.read().encode()) authors = tree.xpath('/fb:FictionBook/fb:description/fb:title-info/fb:author', namespaces=ns) diff --git a/test/Calibre-Web TestSummary_Windows.html b/test/Calibre-Web TestSummary_Windows.html index eadf672d..6668632d 100644 --- a/test/Calibre-Web TestSummary_Windows.html +++ b/test/Calibre-Web TestSummary_Windows.html @@ -37,20 +37,20 @@
Start Time: 2021-01-02 08:38:57
+Start Time: 2021-05-18 17:33:17
Stop Time: 2021-01-02 12:04:50
+Stop Time: 2021-05-18 20:37:38
Duration: 2h 58 min
+Duration: 2h 35 min
Not Implemented-
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_ebook_convert_gdrive.py", line 35, in setUpClass - prepare_gdrive() - File "C:\Entwicklung\calibre-web-test\test\helper_gdrive.py", line 36, in prepare_gdrive - test = fs.makedir('test') - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\fs\googledrivefs\googledrivefs.py", line 343, in makedir - raise DirectoryExists(path=path) -fs.errors.DirectoryExists: directory 'test' exists+
Skipping convert, calibre not found
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_ebook_convert_kepubify_gdrive.py", line 32, in setUpClass - prepare_gdrive() - File "C:\Entwicklung\calibre-web-test\test\helper_gdrive.py", line 30, in prepare_gdrive - fs.removetree('test') - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\fs\base.py", line 1232, in removetree - self.removedir(dir_path) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\fs\googledrivefs\googledrivefs.py", line 395, in removedir - raise DirectoryNotEmpty(path=path) -fs.errors.DirectoryNotEmpty: directory 'test' is not empty+
Skipping convert, calibre not found
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 39, in tearDownClass - cls.stop_calibre_web() - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 370, in stop_calibre_web - cls.driver.find_element_by_id('admin_stop').click() -AttributeError: 'NoneType' object has no attribute 'find_element_by_id' - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 41, in tearDownClass - cls.driver.get("http://127.0.0.1:8083") -AttributeError: 'NoneType' object has no attribute 'get'+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found
Skipping convert, kepubify not found+
Skipping convert, kepubify not found+
Skipping convert, kepubify not found+
Skipping convert, kepubify not found+
Skipping convert, kepubify not found+
Skipping convert, kepubify not found+
Not Implemented-
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_edit_books.py", line 828, in test_upload_book_fb2 + self.assertEqual('book55 - Lul执 de Marco', details['title']) +AssertionError: 'book55 - Lul执 de Marco' != 'book55 - Lul执 de Marco' +- book55 - Lul执 de Marco +? ^ ++ book55 - Lul执 de Marco +? ^^^+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_edit_books.py", line 811, in test_upload_book_pdf + self.assertLess('23300', resp.headers['Content-Length']) +AssertionError: '23300' not less than '19501'+
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_edit_ebooks_gdrive.py", line 716, in test_upload_cover_hdd - self.assertGreater(diff('bmp.png', 'jpeg.png', delete_diff_file=True), 0.006) -AssertionError: 0.003931532360116369 not greater than 0.006+ File "C:\Development\calibre-web-test\test\test_edit_ebooks_gdrive.py", line 371, in test_edit_author + self.assertEqual(u'Pipo, Pipe', author.get_attribute('value')) +AssertionError: 'Pipo, Pipe' != 'Pipo| Pipe' +- Pipo, Pipe +? ^ ++ Pipo| Pipe +? ^
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_edit_ebooks_gdrive.py", line 240, in test_edit_title + self.assertEqual(ele.text, u'Very long extra super turbo cool title without any issue of displaying including ö utf-8 characters') +AttributeError: 'bool' object has no attribute 'text'+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_edit_ebooks_gdrive.py", line 773, in test_upload_cover_hdd + self.assertGreater(diff('bmp.png', 'jpeg.png', delete_diff_file=True), 0.006) +AssertionError: 0.004266211170916505 not greater than 0.006+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_edit_ebooks_gdrive.py", line 908, in test_watch_metadata + self.assertNotIn('series', book) +AssertionError: 'series' unexpectedly found in {'id': 5, 'reader': [], 'title': 'testbook', 'author': ['John Döe'], 'rating': 0, 'languages': ['English'], 'identifier': [], 'cover': '/cover/5?edit=2ac4dcbe-31a1-4812-b439-00968a0c3ab5', 'tag': [], 'publisher': ['Randomhäus'], 'pubdate': 'Jan 19, 2017', 'comment': 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Aenean commodo ligula eget dolor.Aenean massa.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla consequat massa quis enim.Donec pede justo, fringilla vel, aliquet nec, vulputate', 'add_shelf': [], 'del_shelf': [], 'edit_enable': True, 'kindle': None, 'kindlebtn': None, 'download': ['EPUB (6.7 kB)'], 'read': False, 'archived': False, 'series_all': 'Book 1.0 of test', 'series_index': '1.0', 'series': 'test', 'cust_columns': []}+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Skipping convert, calibre not found+
Not implemented+
Not implemented+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 426, in _make_request + six.raise_from(e, None) + File "+", line 3, in raise_from + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 421, in _make_request + httplib_response = conn.getresponse() + File "C:\Python39\lib\http\client.py", line 1345, in getresponse + response.begin() + File "C:\Python39\lib\http\client.py", line 307, in begin + version, status, reason = self._read_status() + File "C:\Python39\lib\http\client.py", line 268, in _read_status + line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") + File "C:\Python39\lib\socket.py", line 704, in readinto + return self._sock.recv_into(b) +socket.timeout: timed out + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\adapters.py", line 439, in send + resp = conn.urlopen( + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 726, in urlopen + retries = retries.increment( + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\util\retry.py", line 410, in increment + raise six.reraise(type(error), error, _stacktrace) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\packages\six.py", line 735, in reraise + raise value + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen + httplib_response = self._make_request( + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 428, in _make_request + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 335, in _raise_timeout + raise ReadTimeoutError( +urllib3.exceptions.ReadTimeoutError: HTTPConnectionPool(host='192.168.188.57', port=8083): Read timed out. (read timeout=10) + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 579, in test_book_download + data = self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 118, in inital_sync + r = session.get(self.kobo_adress+'/v1/library/sync', params=params, headers=TestKoboSync.syncToken, timeout=10) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\sessions.py", line 543, in get + return self.request('GET', url, **kwargs) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\sessions.py", line 530, in request + resp = self.send(prep, **send_kwargs) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\sessions.py", line 643, in send + r = adapter.send(request, **kwargs) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\adapters.py", line 529, in send + raise ReadTimeout(e, request=request) +requests.exceptions.ReadTimeout: HTTPConnectionPool(host='192.168.188.57', port=8083): Read timed out. (read timeout=10)
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 576, in test_kobo_about + self.assertTrue(self.goto_page('nav_about')) +AssertionError: False is not true+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 598, in test_kobo_sync_selected_shelfs + self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 63, in inital_sync + self.get_book_details(5) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 1273, in get_book_details + cls.driver.get(root_url + "/book/" + str(id)) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.WebDriverException: Message: TypeError: this.curBrowser.contentBrowser is null+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 443, in test_shelves_add_remove_books + self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 63, in inital_sync + self.get_book_details(5) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 1273, in get_book_details + cls.driver.get(root_url + "/book/" + str(id)) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 273, in test_sync_changed_book + self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 63, in inital_sync + self.get_book_details(5) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 1273, in get_book_details + cls.driver.get(root_url + "/book/" + str(id)) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 426, in _make_request + six.raise_from(e, None) + File "+", line 3, in raise_from + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 421, in _make_request + httplib_response = conn.getresponse() + File "C:\Python39\lib\http\client.py", line 1345, in getresponse + response.begin() + File "C:\Python39\lib\http\client.py", line 307, in begin + version, status, reason = self._read_status() + File "C:\Python39\lib\http\client.py", line 268, in _read_status + line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") + File "C:\Python39\lib\socket.py", line 704, in readinto + return self._sock.recv_into(b) +socket.timeout: timed out + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\adapters.py", line 439, in send + resp = conn.urlopen( + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 726, in urlopen + retries = retries.increment( + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\util\retry.py", line 410, in increment + raise six.reraise(type(error), error, _stacktrace) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\packages\six.py", line 735, in reraise + raise value + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen + httplib_response = self._make_request( + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 428, in _make_request + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\urllib3\connectionpool.py", line 335, in _raise_timeout + raise ReadTimeoutError( +urllib3.exceptions.ReadTimeoutError: HTTPConnectionPool(host='192.168.188.57', port=8083): Read timed out. (read timeout=10) + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 225, in test_sync_invalid + r = requests.post(self.kobo_adress+'x/v1/auth/device', json=payload, timeout=10) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\api.py", line 119, in post + return request('post', url, data=data, json=json, **kwargs) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\api.py", line 61, in request + return session.request(method=method, url=url, **kwargs) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\sessions.py", line 530, in request + resp = self.send(prep, **send_kwargs) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\sessions.py", line 643, in send + r = adapter.send(request, **kwargs) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\requests\adapters.py", line 529, in send + raise ReadTimeout(e, request=request) +requests.exceptions.ReadTimeout: HTTPConnectionPool(host='192.168.188.57', port=8083): Read timed out. (read timeout=10)
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 510, in test_sync_reading_state + self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 63, in inital_sync + self.get_book_details(5) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 1273, in get_book_details + cls.driver.get(root_url + "/book/" + str(id)) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 292, in test_sync_shelf + self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 63, in inital_sync + self.get_book_details(5) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 1273, in get_book_details + cls.driver.get(root_url + "/book/" + str(id)) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 238, in test_sync_unchanged + self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 63, in inital_sync + self.get_book_details(5) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 1273, in get_book_details + cls.driver.get(root_url + "/book/" + str(id)) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 252, in test_sync_upload + self.inital_sync() + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 63, in inital_sync + self.get_book_details(5) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 1273, in get_book_details + cls.driver.get(root_url + "/book/" + str(id)) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_kobo_sync.py", line 51, in tearDownClass + cls.driver.get("http://127.0.0.1:8083") + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded+
Traceback (most recent call last): + File "C:\Python39\lib\shutil.py", line 806, in move + os.rename(src, real_dst) +PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Development\\calibre-web\\calibre-web.log' -> 'C:\\Development\\calibre-web-test\\test\\outcome\\TestUpdater-20210518195021\\calibre-web.log' + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_updater.py", line 52, in tearDownClass + save_logfiles(cls, cls.__name__) + File "C:\Development\calibre-web-test\test\helper_func.py", line 362, in save_logfiles + shutil.move(src,dest) + File "C:\Python39\lib\shutil.py", line 827, in move + os.unlink(src) +PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Development\\calibre-web\\calibre-web.log'+
Traceback (most recent call last): + File "C:\Python39\lib\shutil.py", line 806, in move + os.rename(src, real_dst) +PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Development\\calibre-web\\calibre-web.log' -> 'C:\\Development\\calibre-web-test\\test\\outcome\\TestUserList-20210518200437\\calibre-web.log' + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_user_list.py", line 71, in tearDownClass + save_logfiles(cls, cls.__name__) + File "C:\Development\calibre-web-test\test\helper_func.py", line 362, in save_logfiles + shutil.move(src,dest) + File "C:\Python39\lib\shutil.py", line 827, in move + os.unlink(src) +PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Development\\calibre-web\\calibre-web.log'+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_user_load.py", line 59, in tearDownClass + cls.stop_calibre_web() + File "C:\Development\calibre-web-test\test\helper_ui.py", line 376, in stop_calibre_web + cls.driver.find_element_by_id('admin_stop').click() + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 360, in find_element_by_id + return self.find_element(by=By.ID, value=id_) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element + return self.execute(Command.FIND_ELEMENT, { + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="admin_stop"] + + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_user_load.py", line 61, in tearDownClass + cls.driver.get("http://127.0.0.1:8083") + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 333, in get + self.execute(Command.GET, {'url': url}) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.TimeoutException: Message: TimedPromise timed out after 300000 ms+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_visiblilitys.py", line 32, in tearDownClass + cls.stop_calibre_web() + File "C:\Development\calibre-web-test\test\helper_ui.py", line 378, in stop_calibre_web + element.click() + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click + self._execute(Command.CLICK_ELEMENT) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute + return self._parent.execute(command, params) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.ElementNotInteractableException: Message: Element+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_ldap.py", line 609, in test_LDAP_SSL_CERTIFICATE + self.assertTrue(self.check_element_on_page((By.ID, "flash_success"))) +AssertionError: False is not true+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_ldap.py", line 638, in test_LDAP_STARTTLS + self.fill_basic_config({'config_ldap_provider_url': '127.0.0.1', + File "C:\Development\calibre-web-test\test\helper_ui.py", line 288, in fill_basic_config + cls.fill_initial_config(elements) + File "C:\Development\calibre-web-test\test\helper_ui.py", line 201, in fill_initial_config + WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_calibre_dir"))) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until + raise TimeoutException(message, screen, stacktrace) +selenium.common.exceptions.TimeoutException: Message:+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_ldap.py", line 401, in test_LDAP_import + self.assertEqual(len(userlist), 3) +AssertionError: 4 != 3+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_ldap.py", line 222, in test_LDAP_login + self.assertTrue(self.check_element_on_page((By.ID, "flash_success"))) +AssertionError: False is not true+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_ldap.py", line 757, in test_ldap_authentication + self.assertTrue(self.check_element_on_page((By.ID, "flash_success"))) +AssertionError: False is not true+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_ldap.py", line 1024, in test_ldap_kobo_sync + self.assertTrue(self.check_element_on_page((By.ID, "flash_success"))) +AssertionError: False is not true+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_ldap.py", line 840, in test_ldap_opds_download_book + self.assertTrue(self.check_element_on_page((By.ID, "flash_success"))) +AssertionError: False is not true+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_logging.py", line 148, in test_logfile_recover + self.assertFalse(os.path.isfile(os.path.join(CALIBRE_WEB_PATH, 'calibre-web.log'))) +AssertionError: True is not false+
Traceback (most recent call last): + File "C:\Development\calibre-web-test\test\test_login.py", line 342, in test_proxy_login + self.assertTrue("Calibre-Web | login" in resp.text) +AssertionError: False is not true+
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 206, in test_check_update_nightly_errors - self.fill_basic_config({'config_updatechannel': 'Nightly'}) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 282, in fill_basic_config - cls.fill_initial_config(elements) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 198, in fill_initial_config - WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_calibre_dir"))) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 55, in tearDown - if not self.check_user_logged_in('admin'): - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 88, in check_user_logged_in - user_element = cls.check_element_on_page((By.ID, "top_user")) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 633, in check_element_on_page - el = WebDriverWait(cls.driver, timeout).until(EC.presence_of_element_located(element)) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 234, in test_check_update_nightly_request_errors - self.fill_basic_config({'config_updatechannel': 'Nightly'}) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 282, in fill_basic_config - cls.fill_initial_config(elements) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 198, in fill_initial_config - WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_calibre_dir"))) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 55, in tearDown - if not self.check_user_logged_in('admin'): - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 88, in check_user_logged_in - user_element = cls.check_element_on_page((By.ID, "top_user")) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 633, in check_element_on_page - el = WebDriverWait(cls.driver, timeout).until(EC.presence_of_element_located(element)) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 118, in test_check_update_stable_errors - self.fill_basic_config({'config_updatechannel': 'Stable'}) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 282, in fill_basic_config - cls.fill_initial_config(elements) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 198, in fill_initial_config - WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_calibre_dir"))) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 55, in tearDown - if not self.check_user_logged_in('admin'): - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 88, in check_user_logged_in - user_element = cls.check_element_on_page((By.ID, "top_user")) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 633, in check_element_on_page - el = WebDriverWait(cls.driver, timeout).until(EC.presence_of_element_located(element)) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 146, in test_check_update_stable_versions - self.fill_basic_config({'config_updatechannel': 'Stable'}) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 282, in fill_basic_config - cls.fill_initial_config(elements) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 198, in fill_initial_config - WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_calibre_dir"))) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 55, in tearDown - if not self.check_user_logged_in('admin'): - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 88, in check_user_logged_in - user_element = cls.check_element_on_page((By.ID, "top_user")) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 633, in check_element_on_page - el = WebDriverWait(cls.driver, timeout).until(EC.presence_of_element_located(element)) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 341, in test_perform_update - self.fill_basic_config({'config_updatechannel': 'Stable'}) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 282, in fill_basic_config - cls.fill_initial_config(elements) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 198, in fill_initial_config - WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_calibre_dir"))) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'+ File "C:\Development\calibre-web-test\test\test_updater.py", line 364, in test_perform_update + self.check_element_on_page((By.ID, "DialogFinished")).click() + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click + self._execute(Command.CLICK_ELEMENT) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute + return self._parent.execute(command, params) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.ElementNotInteractableException: Message: Element
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 55, in tearDown - if not self.check_user_logged_in('admin'): - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 88, in check_user_logged_in - user_element = cls.check_element_on_page((By.ID, "top_user")) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 633, in check_element_on_page - el = WebDriverWait(cls.driver, timeout).until(EC.presence_of_element_located(element)) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 288, in test_perform_update_stable_errors + File "C:\Development\calibre-web-test\test\test_updater.py", line 290, in test_perform_update_stable_errors self.fill_basic_config({'config_updatechannel': 'Stable'}) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 282, in fill_basic_config + File "C:\Development\calibre-web-test\test\helper_ui.py", line 288, in fill_basic_config cls.fill_initial_config(elements) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 198, in fill_initial_config + File "C:\Development\calibre-web-test\test\helper_ui.py", line 201, in fill_initial_config WebDriverWait(cls.driver, 5).until(EC.presence_of_element_located((By.ID, "config_calibre_dir"))) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'+ File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until + raise TimeoutException(message, screen, stacktrace) +selenium.common.exceptions.TimeoutException: Message:
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 55, in tearDown - if not self.check_user_logged_in('admin'): - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 88, in check_user_logged_in - user_element = cls.check_element_on_page((By.ID, "top_user")) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 633, in check_element_on_page - el = WebDriverWait(cls.driver, timeout).until(EC.presence_of_element_located(element)) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'-
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 366, in test_reconnect_database + File "C:\Development\calibre-web-test\test\test_updater.py", line 371, in test_reconnect_database self.reconnect_database() - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 356, in reconnect_database + File "C:\Development\calibre-web-test\test\helper_ui.py", line 362, in reconnect_database self.driver.find_element_by_id('restart_database').click() -AttributeError: 'NoneType' object has no attribute 'find_element_by_id'+ File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click + self._execute(Command.CLICK_ELEMENT) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute + return self._parent.execute(command, params) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute + self.error_handler.check_response(response) + File "C:\Development\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response + raise exception_class(message, screen, stacktrace) +selenium.common.exceptions.ElementClickInterceptedException: Message: Element
Traceback (most recent call last): - File "C:\Entwicklung\calibre-web-test\test\test_updater.py", line 55, in tearDown - if not self.check_user_logged_in('admin'): - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 88, in check_user_logged_in - user_element = cls.check_element_on_page((By.ID, "top_user")) - File "C:\Entwicklung\calibre-web-test\test\helper_ui.py", line 633, in check_element_on_page - el = WebDriverWait(cls.driver, timeout).until(EC.presence_of_element_located(element)) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until - value = method(self._driver) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__ - return _find_element(driver, self.locator) - File "C:\Entwicklung\calibre-web-test\test\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element - return driver.find_element(*by) -AttributeError: 'NoneType' object has no attribute 'find_element'+
ImportError: Failed to import test module: test_upload_epubs +Traceback (most recent call last): + File "C:\Python39\lib\unittest\loader.py", line 436, in _find_test_path + module = self._get_module_from_name(name) + File "C:\Python39\lib\unittest\loader.py", line 377, in _get_module_from_name + __import__(name) + File "C:\Development\calibre-web-test\test\test_upload_epubs.py", line 10, in+ from bs4 import BeautifulSoup +ModuleNotFoundError: No module named 'bs4'