Skip to content

Commit 5f79ed8

Browse files
soraxaspaulpall
andcommitted
Merge branch 'apple_silicon_support'
Co-authored-by: Paul Johannes Aru <[email protected]>
2 parents 1d01827 + d2de787 commit 5f79ed8

File tree

5 files changed

+128
-51
lines changed

5 files changed

+128
-51
lines changed

echo360/binary_downloader/chromedriver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class ChromedriverDownloader(BinaryDownloader):
55
def __init__(self):
66
self._name = "chromedriver"
77
self._download_link_root = "https://chromedriver.storage.googleapis.com"
8-
self._version = "2.38"
8+
self._version = "114.0.5735.90"
99

1010
def get_os_suffix(self):
1111
self._os_linux_32 = "linux32"
@@ -14,6 +14,7 @@ def get_os_suffix(self):
1414
self._os_windows_64 = "win32"
1515
self._os_darwin_32 = "mac64"
1616
self._os_darwin_64 = "mac64"
17+
self._os_darwin_arm = "mac_arm64"
1718
return super(ChromedriverDownloader, self).get_os_suffix()
1819

1920
def get_download_link(self):

echo360/binary_downloader/downloader.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import sys
22
import os
3+
import platform
34
import stat
45
import wget
56
import shutil
@@ -25,6 +26,9 @@ def get_os_suffix(self):
2526
else:
2627
return self._os_windows_32
2728
elif "darwin" in sys.platform:
29+
# detect if this is using arm processor (e.g. M1/M2 Mac)
30+
if platform.processor() == "arm":
31+
return self._os_darwin_arm
2832
if arch == "64":
2933
return self._os_darwin_64
3034
else:

echo360/binary_downloader/firefoxdriver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def __init__(self):
77
self._download_link_root = (
88
"https://github.com/mozilla/geckodriver/releases/download"
99
)
10-
self._version = "v0.30.0"
10+
self._version = "v0.33.0"
1111

1212
def get_os_suffix(self):
1313
self._os_linux_32 = "linux32"
@@ -16,6 +16,7 @@ def get_os_suffix(self):
1616
self._os_windows_64 = "win64"
1717
self._os_darwin_32 = "macos"
1818
self._os_darwin_64 = "macos"
19+
self._os_darwin_arm = "macos-aarch64"
1920
return super(FirefoxDownloader, self).get_os_suffix()
2021

2122
def get_download_link(self):

echo360/downloader.py

Lines changed: 114 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
from .course import EchoCloudCourse
88
from .echo_exceptions import EchoLoginError
9+
from .utils import naive_versiontuple
10+
911

1012
from pick import pick
1113
import selenium
@@ -19,6 +21,101 @@
1921
_LOGGER = logging.getLogger(__name__)
2022

2123

24+
def build_chrome_driver(
25+
use_local_binary, selenium_version_ge_4100, setup_credential, user_agent, log_path
26+
):
27+
from selenium.webdriver.chrome.options import Options
28+
29+
opts = Options()
30+
if not setup_credential:
31+
opts.add_argument("--headless")
32+
opts.add_argument("--window-size=1920x1080")
33+
opts.add_argument("user-agent={}".format(user_agent))
34+
35+
kwargs = dict()
36+
if selenium_version_ge_4100:
37+
kwargs["options"] = opts
38+
else:
39+
kwargs["chrome_options"] = opts
40+
41+
if selenium_version_ge_4100:
42+
from selenium.webdriver.chrome.service import Service
43+
44+
service = Service(**kwargs, log_file=log_path)
45+
kwargs = dict(
46+
service=service,
47+
options=opts,
48+
)
49+
else:
50+
if use_local_binary:
51+
# newer selenium helps us to auto-download executable
52+
from .binary_downloader.chromedriver import ChromedriverDownloader
53+
54+
kwargs["executable_path"] = ChromedriverDownloader().get_bin()
55+
kwargs.update(
56+
dict(
57+
service_log_path=log_path,
58+
chrome_options=opts,
59+
)
60+
)
61+
return webdriver.Chrome(**kwargs)
62+
63+
64+
def build_firefox_driver(
65+
use_local_binary, selenium_version_ge_4100, setup_credential, user_agent, log_path
66+
):
67+
profile = webdriver.FirefoxProfile()
68+
profile.set_preference("general.useragent.override", user_agent)
69+
kwargs = dict()
70+
71+
if selenium_version_ge_4100:
72+
from selenium.webdriver.firefox.service import Service
73+
from selenium.webdriver.firefox.options import Options
74+
75+
option = Options()
76+
option.profile = profile
77+
78+
service = Service(**kwargs, log_file=log_path)
79+
kwargs = dict(
80+
service=service,
81+
options=option,
82+
)
83+
else:
84+
if use_local_binary:
85+
from .binary_downloader.firefoxdriver import FirefoxDownloader
86+
87+
kwargs["executable_path"] = FirefoxDownloader().get_bin()
88+
kwargs.update(
89+
dict(
90+
service_log_path=log_path,
91+
firefox_profile=profile,
92+
)
93+
)
94+
return webdriver.Firefox(**kwargs)
95+
96+
97+
def build_phantomjs_driver(
98+
use_local_binary, selenium_version_ge_4100, setup_credential, user_agent, log_path
99+
):
100+
dcap = dict()
101+
dcap.update(DesiredCapabilities.PHANTOMJS)
102+
dcap["phantomjs.page.settings.userAgent"] = (
103+
"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 "
104+
"(KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"
105+
)
106+
kwargs = {
107+
"desired_capabilities": dcap,
108+
"service_log_path": log_path,
109+
}
110+
111+
if use_local_binary:
112+
from .binary_downloader.phantomjs import PhantomjsDownloader
113+
114+
kwargs["executable_path"] = PhantomjsDownloader().get_bin()
115+
116+
return webdriver.PhantomJS(**kwargs)
117+
118+
22119
class EchoDownloader(object):
23120
def __init__(
24121
self,
@@ -51,66 +148,34 @@ def __init__(
51148
# self._driver = webdriver.PhantomJS()
52149

53150
if webdriver_to_use == "phantomjs":
54-
selenium_major_version = int(selenium.__version__.split('.')[0])
151+
selenium_major_version = int(selenium.__version__.split(".")[0])
55152
if selenium_major_version >= 4:
56153
print("============================================================")
57154
print("WARNING: PhantomJS support had been removed in in selenium")
58155
print(" version 4. If this app errors out later on, consider")
59156
print(" installing earlier version of selenium.")
60157
print(" e.g. pip3 install selenium==3.14")
61-
print(" (see https://github.com/SeleniumHQ/selenium/blob/58122b261a5f5406da8e5252c9ab54c464da7aa8/py/CHANGES#L324)")
158+
print(
159+
" (see https://github.com/SeleniumHQ/selenium/blob/58122b261a5f5406da8e5252c9ab54c464da7aa8/py/CHANGES#L324)"
160+
)
62161
print("============================================================")
63162

64-
dcap = dict()
65-
if use_local_binary:
66-
if webdriver_to_use == "chrome":
67-
from .binary_downloader.chromedriver import ChromedriverDownloader
68-
69-
get_bin = ChromedriverDownloader().get_bin
70-
elif webdriver_to_use == "firefox":
71-
from .binary_downloader.firefoxdriver import FirefoxDownloader
72-
73-
get_bin = FirefoxDownloader().get_bin
74-
else:
75-
from .binary_downloader.phantomjs import PhantomjsDownloader
76-
77-
get_bin = PhantomjsDownloader().get_bin
78-
dcap.update(DesiredCapabilities.PHANTOMJS)
79-
dcap["phantomjs.page.settings.userAgent"] = (
80-
"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 "
81-
"(KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"
82-
)
83-
kwargs = {
84-
"executable_path": get_bin(),
85-
"desired_capabilities": dcap,
86-
"service_log_path": log_path,
87-
}
88-
else:
89-
kwargs = {}
90163
if webdriver_to_use == "chrome":
91-
from selenium.webdriver.chrome.options import Options
92-
93-
opts = Options()
94-
if not setup_credential:
95-
opts.add_argument("--headless")
96-
opts.add_argument("--window-size=1920x1080")
97-
opts.add_argument("user-agent={}".format(self._useragent))
98-
kwargs["chrome_options"] = opts
99-
self._driver = webdriver.Chrome(**kwargs)
164+
driver_builder = build_chrome_driver
100165
elif webdriver_to_use == "firefox":
101-
# from selenium.webdriver.firefox.options import Options
102-
# opts = Options()
103-
# if not setup_credential:
104-
# opts.add_argument("--headless")
105-
# # opts.add_argument("--window-size=1920x1080")
106-
# opts.add_argument("user-agent={}".format(self._useragent))
107-
# kwargs['firefox_options'] = opts
108-
profile = webdriver.FirefoxProfile()
109-
profile.set_preference("general.useragent.override", self._useragent)
110-
# driver = webdriver.Firefox(profile)
111-
self._driver = webdriver.Firefox(profile, **kwargs)
166+
driver_builder = build_firefox_driver
112167
else:
113-
self._driver = webdriver.PhantomJS(**kwargs)
168+
driver_builder = build_phantomjs_driver
169+
170+
self._driver = driver_builder(
171+
use_local_binary=use_local_binary,
172+
selenium_version_ge_4100=(
173+
naive_versiontuple(selenium.__version__) >= naive_versiontuple("4.10.0")
174+
),
175+
setup_credential=setup_credential,
176+
user_agent=self._useragent,
177+
log_path=log_path,
178+
)
114179

115180
self.setup_credential = setup_credential
116181
# Monkey Patch, set the course's driver to the one from .downloader

echo360/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
def naive_versiontuple(v):
2+
"""
3+
This only works for version tuple with the same number of parts.
4+
Expects naive_versiontuple('xx.yy.zz') < naive_versiontuple('aa.bb.cc').
5+
"""
6+
return tuple(map(int, (v.split("."))))

0 commit comments

Comments
 (0)