Skip to content

Commit ba53d54

Browse files
Merge pull request #17 from LeithMerrifield/Dev
Created auto updater/installer for the chrome driver
2 parents 184498c + 790827f commit ba53d54

File tree

6 files changed

+124
-14
lines changed

6 files changed

+124
-14
lines changed

Main.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import sys
33
import logging
4+
import threading
45
import json
56
from datetime import datetime
67

@@ -13,6 +14,7 @@
1314
from src.LoginScreen import LoginScreen
1415
from src.ScannerScreen import ScannerScreen
1516
from src.SettingsScreen import SettingsScreen
17+
from src.CheckDriver import compare_and_download as driver_update
1618
from kivy.base import Builder
1719

1820
Builder.load_file("./src/kv/Login.kv")
@@ -50,5 +52,13 @@ def Bypass_Reopen_Tabs():
5052

5153

5254
if __name__ == "__main__":
53-
Bypass_Reopen_Tabs()
55+
threading.Thread(
56+
target=Bypass_Reopen_Tabs,
57+
daemon=True,
58+
).start()
59+
60+
threading.Thread(
61+
target=driver_update,
62+
daemon=True,
63+
).start()
5464
LoginApp().run()

src/CheckDriver.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import subprocess
2+
import json
3+
from os.path import exists
4+
from os import remove
5+
from zipfile import ZipFile
6+
from urllib.request import urlretrieve
7+
8+
9+
def get_driver_version():
10+
ps = "curl https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_STABLE"
11+
return subprocess.check_output(ps, shell=True).decode("utf-8")
12+
13+
14+
def get_download_link(version_number):
15+
downloads_json = "curl https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"
16+
downloads = subprocess.check_output(downloads_json, shell=True)
17+
link = None
18+
# converts to json format and grabs only the versions dict
19+
downloads = json.loads(downloads)["versions"]
20+
21+
# loops through dict looking for the correct version number from download list
22+
# returns download link
23+
for version in downloads:
24+
if version["version"] == version_number:
25+
platforms = version["downloads"]["chromedriver"]
26+
for platform in platforms:
27+
if platform["platform"] == "win64":
28+
link = platform["url"]
29+
return link
30+
31+
32+
def check_file():
33+
if exists("./src/driver_version.json"):
34+
return
35+
else:
36+
with open("./src/driver_version.json", "w", encoding="utf-8") as openfile:
37+
template = {"Chrome_Driver_Version": ""}
38+
json.dump(template, openfile, indent=4)
39+
return
40+
41+
42+
def get_local_driver_version():
43+
version = None
44+
try:
45+
with open("./src/driver_version.json", "r", encoding="utf-8") as openfile:
46+
json_object = json.load(openfile)
47+
version = json_object["Chrome_Driver_Version"]
48+
except KeyError:
49+
version = ""
50+
return version
51+
52+
53+
def update_version(version):
54+
json_object = None
55+
with open("./src/driver_version.json", "r", encoding="utf-8") as openfile:
56+
json_object = json.load(openfile)
57+
58+
with open("./src/driver_version.json", "w", encoding="utf-8") as openfile:
59+
json_object["Chrome_Driver_Version"] = version
60+
json.dump(json_object, openfile, indent=4)
61+
62+
63+
def clean():
64+
remove("./driver.zip")
65+
return
66+
67+
68+
def compare_and_download():
69+
check_file()
70+
local_version = get_local_driver_version()
71+
remote_version = get_driver_version()
72+
73+
if local_version.split(".")[0] == remote_version.split(".")[0]:
74+
print("chrome driver up to date")
75+
return
76+
77+
remote_download_link = get_download_link(remote_version)
78+
79+
urlretrieve(remote_download_link, "./driver.zip")
80+
81+
with ZipFile("./driver.zip", "r") as zipObj:
82+
zipObj.extractall()
83+
update_version(remote_version)
84+
clean()

src/LoginScreen.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ def store_login(self, username=None, password=None):
6868
"remember": True,
6969
}
7070

71-
with open(r"src\database.json", "w") as openfile:
71+
with open(r"src\database.json", "w", encoding="utf-8") as openfile:
7272
json.dump(login_object, openfile, indent=4)
7373

7474
def reset_database(self):
7575
default_object = {}
76-
with open(r"src\database.json", "w") as openfile:
76+
with open(r"src\database.json", "w", encoding="utf-8") as openfile:
7777
json.dump(default_object, openfile, indent=4)
7878

7979
def decrypt_pass(self, password, key):
@@ -84,7 +84,7 @@ def read_json(self):
8484
if not os.path.exists(r"src\database.json"):
8585
return None
8686

87-
with open(r"src\database.json", "r") as openfile:
87+
with open(r"src\database.json", "r", encoding="utf-8") as openfile:
8888
json_object = json.load(openfile)
8989

9090
return json_object
@@ -93,7 +93,7 @@ def do_login(self):
9393
username = self.ids.username.text
9494
password = self.ids.password.text
9595
# if nothing, need to store new login
96-
#if "@bollebrands.com" not in username.lower() or password == "":
96+
# if "@bollebrands.com" not in username.lower() or password == "":
9797
# return
9898

9999
if self.ids.login_checkbox.active:

src/MainWebDriver.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from selenium.webdriver.chrome.options import Options
99
from src import Elements
1010
from src.state import State
11+
from src.CheckDriver import compare_and_download as update_driver
1112
from selenium.webdriver.chrome.service import (
1213
Service as ChromeService,
1314
) # Similar thing for firefox also!
@@ -356,18 +357,33 @@ def login(
356357
self.run_driver(chrome_service, chrome_options, True)
357358
else:
358359
self.run_driver(chrome_service, chrome_options, False)
359-
except exceptions.SessionNotCreatedException:
360+
except (
361+
exceptions.SessionNotCreatedException,
362+
exceptions.SeleniumManagerException,
363+
):
360364
login_callback()
361365
Clock.schedule_once(
362366
partial(
363367
self.test_popup,
364368
"Chrome Driver Issue",
365-
" You need to disable the manual override.\n"
366-
+ " If the issue persists\n"
367-
+ "Update and manually set the chrome driver.",
369+
" I've downloaded the new driver\n \
370+
Try again",
368371
),
369372
1,
370373
)
374+
update_driver()
375+
return
376+
except exceptions.WebDriverException as e:
377+
login_callback()
378+
if "cannot find chrome binary" in e.msg.lower():
379+
Clock.schedule_once(
380+
partial(
381+
self.test_popup,
382+
"Chrome Issue",
383+
"Chrome isn't installed",
384+
),
385+
1,
386+
)
371387
return
372388
sleep(3)
373389

src/SettingsScreen.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def save_and_return(self):
2222
"Timeout_Avoidance": self.timeout_avoidance,
2323
}
2424

25-
with open(r"src\settings.json", "w",encoding="utf-8") as openfile:
25+
with open(r"src\settings.json", "w", encoding="utf-8") as openfile:
2626
json.dump(json_object, openfile, indent=4)
2727

2828
self.manager.transition = SlideTransition(direction="left")
@@ -33,16 +33,16 @@ def set_previous_screen(self, screen):
3333

3434
def load_settings(self):
3535
if not os.path.exists(r"src\settings.json"):
36-
with open(r".\src\settings.json", "w") as openfile:
36+
with open(r".\src\settings.json", "w", encoding="utf-8") as openfile:
3737
json_object = {
3838
"Netsuite_SSO": "Replace with Netsuite SSO",
3939
"Netsuite": "https://5230881.app.netsuite.com/app/center/card.nl?sc=-29&whence=",
40-
"Chrome_Driver": ["None", False],
40+
"Chrome_Driver": ["./chromedriver-win64/chromedriver.exe", False],
4141
"Timeout_Avoidance": True,
4242
}
4343
json.dump(json_object, openfile, indent=4)
4444

45-
with open(r".\src\settings.json", "r") as openfile:
45+
with open(r".\src\settings.json", "r", encoding="utf-8") as openfile:
4646
json_object = json.load(openfile)
4747

4848
self.netsuite_sso = json_object["Netsuite_SSO"]

src/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"Netsuite_SSO": "https://launcher.myapps.microsoft.com/api/signin/fd4bc304-663f-4e7b-9245-93596454cc99?tenantId=7261aa19-728c-457c-bb6e-a31f9a21516d",
33
"Netsuite": "https://5230881.app.netsuite.com/app/center/card.nl?sc=-29&whence=",
44
"Chrome_Driver": [
5-
"C:\\chromedriver-win32\\chromedriver.exe",
5+
"./chromedriver-win64/chromedriver.exe",
66
true
77
],
88
"Timeout_Avoidance": true

0 commit comments

Comments
 (0)