Skip to content

Commit 369ab50

Browse files
authored
Merge pull request #2019 from seleniumbase/improve-uc-mode-on-linux
Improve UC Mode on Linux
2 parents 51340b9 + 5db5cf5 commit 369ab50

File tree

8 files changed

+136
-65
lines changed

8 files changed

+136
-65
lines changed

mkdocs_build/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ paginate==0.5.6
2020
pyquery==2.0.0
2121
readtime==3.0.0
2222
mkdocs==1.5.2
23-
mkdocs-material==9.2.1
23+
mkdocs-material==9.2.3
2424
mkdocs-exclude-search==0.6.5
2525
mkdocs-simple-hooks==0.1.5
2626
mkdocs-material-extensions==1.1.1

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ setuptools>=59.6.0;python_version<"3.7"
66
setuptools>=68.0.0;python_version>="3.7" and python_version<"3.8"
77
setuptools>=68.1.2;python_version>="3.8"
88
wheel>=0.37.1;python_version<"3.7"
9-
wheel>=0.41.1;python_version>="3.7"
9+
wheel>=0.41.2;python_version>="3.7"
1010
attrs==22.1.0;python_version<"3.7"
1111
attrs>=23.1.0;python_version>="3.7"
1212
certifi>=2023.7.22

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.17.9"
2+
__version__ = "4.17.10"

seleniumbase/core/browser_launcher.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,11 @@ def _set_chrome_options(
855855
if is_using_uc(undetectable, browser_name):
856856
chrome_options.add_argument("--disable-application-cache")
857857
chrome_options.add_argument("--disable-setuid-sandbox")
858+
if is_using_uc(undetectable, browser_name) and not binary_location:
859+
br_app = "google-chrome"
860+
binary_loc = detect_b_ver.get_binary_location(br_app, True)
861+
if os.path.exists(binary_loc):
862+
binary_location = binary_loc
858863
if chromium_arg:
859864
# Can be a comma-separated list of Chromium args
860865
chromium_arg_list = chromium_arg.split(",")
@@ -875,7 +880,9 @@ def _set_chrome_options(
875880
pass
876881
if "set-binary" in chromium_arg_item and not binary_location:
877882
br_app = "google-chrome"
878-
binary_loc = detect_b_ver.get_binary_location(br_app)
883+
binary_loc = detect_b_ver.get_binary_location(
884+
br_app, is_using_uc(undetectable, browser_name)
885+
)
879886
if os.path.exists(binary_loc):
880887
binary_location = binary_loc
881888
elif len(chromium_arg_item) >= 3:
@@ -2897,11 +2904,11 @@ def get_local_driver(
28972904
major_chrome_version = None
28982905
if selenium4_or_newer:
28992906
try:
2900-
if binary_location:
2907+
if chrome_options.binary_location:
29012908
try:
29022909
major_chrome_version = (
29032910
detect_b_ver.get_browser_version_from_binary(
2904-
binary_location
2911+
chrome_options.binary_location,
29052912
)
29062913
).split(".")[0]
29072914
if len(major_chrome_version) < 2:

seleniumbase/core/detect_b_ver.py

Lines changed: 109 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,105 @@ def linux_browser_apps_to_cmd(*apps):
9696
)
9797

9898

99+
def chrome_on_linux_path(prefer_chromium=False):
100+
if os_name() != "linux":
101+
return ""
102+
primary_chrome = "google-chrome"
103+
secondary_chrome = "chromium"
104+
if prefer_chromium:
105+
primary_chrome = "chromium"
106+
secondary_chrome = "google-chrome"
107+
paths = os.environ["PATH"].split(os.pathsep)
108+
binaries = []
109+
binaries.append(primary_chrome)
110+
binaries.append(secondary_chrome)
111+
binaries.append("chromium-browser")
112+
binaries.append("chrome")
113+
binaries.append("google-chrome-stable")
114+
binaries.append("google-chrome-beta")
115+
binaries.append("google-chrome-dev")
116+
binaries.append("google-chrome-unstable")
117+
for binary in binaries:
118+
for path in paths:
119+
full_path = os.path.join(path, binary)
120+
if os.path.exists(full_path) and os.access(full_path, os.X_OK):
121+
return full_path
122+
return "/usr/bin/google-chrome"
123+
124+
125+
def edge_on_linux_path():
126+
if os_name() != "linux":
127+
return ""
128+
paths = os.environ["PATH"].split(os.pathsep)
129+
binaries = []
130+
binaries.append("microsoft-edge")
131+
binaries.append("microsoft-edge-stable")
132+
binaries.append("microsoft-edge-beta")
133+
binaries.append("microsoft-edge-dev")
134+
for binary in binaries:
135+
for path in paths:
136+
full_path = os.path.join(path, binary)
137+
if os.path.exists(full_path) and os.access(full_path, os.X_OK):
138+
return full_path
139+
return "/usr/bin/microsoft-edge"
140+
141+
142+
def chrome_on_windows_path():
143+
if os_name() != "win32":
144+
return ""
145+
candidates = []
146+
for item in map(
147+
os.environ.get,
148+
(
149+
"PROGRAMFILES",
150+
"PROGRAMFILES(X86)",
151+
"LOCALAPPDATA",
152+
"PROGRAMW6432",
153+
),
154+
):
155+
for subitem in (
156+
"Google/Chrome/Application",
157+
"Google/Chrome Beta/Application",
158+
"Google/Chrome Canary/Application",
159+
):
160+
try:
161+
candidates.append(os.sep.join((item, subitem, "chrome.exe")))
162+
except TypeError:
163+
pass
164+
for candidate in candidates:
165+
if os.path.exists(candidate) and os.access(candidate, os.X_OK):
166+
return os.path.normpath(candidate)
167+
return ""
168+
169+
170+
def edge_on_windows_path():
171+
if os_name() != "win32":
172+
return ""
173+
candidates = []
174+
for item in map(
175+
os.environ.get,
176+
(
177+
"PROGRAMFILES",
178+
"PROGRAMFILES(X86)",
179+
"LOCALAPPDATA",
180+
"PROGRAMW6432",
181+
),
182+
):
183+
for subitem in (
184+
"Microsoft/Edge/Application",
185+
"Microsoft/Edge Beta/Application",
186+
"Microsoft/Edge Canary/Application",
187+
):
188+
try:
189+
candidates.append(os.sep.join((item, subitem, "msedge.exe")))
190+
except TypeError:
191+
pass
192+
for candidate in candidates:
193+
if os.path.exists(candidate) and os.access(candidate, os.X_OK):
194+
return os.path.normpath(candidate)
195+
return ""
196+
197+
99198
def windows_browser_apps_to_cmd(*apps):
100199
"""Create analogue of browser --version command for windows."""
101200
powershell = determine_powershell()
@@ -106,63 +205,21 @@ def windows_browser_apps_to_cmd(*apps):
106205
return '%s -NoProfile "%s"' % (powershell, script)
107206

108207

109-
def get_binary_location(browser_type):
208+
def get_binary_location(browser_type, prefer_chromium=False):
209+
"""Return the full path of the browser binary.
210+
If going for better results in UC Mode, use: prefer_chromium=True"""
110211
cmd_mapping = {
111212
ChromeType.GOOGLE: {
112-
OSType.LINUX: linux_browser_apps_to_cmd(
113-
"google-chrome-stable",
114-
"google-chrome",
115-
"chrome",
116-
"chromium",
117-
"chromium-browser",
118-
"google-chrome-beta",
119-
"google-chrome-dev",
120-
"google-chrome-unstable",
121-
),
213+
OSType.LINUX: chrome_on_linux_path(prefer_chromium),
122214
OSType.MAC: r"/Applications/Google Chrome.app"
123215
r"/Contents/MacOS/Google Chrome",
124-
OSType.WIN: windows_browser_apps_to_cmd(
125-
r'(Get-Item -Path "$env:PROGRAMFILES\Google\Chrome'
126-
r'\Application\chrome.exe")',
127-
r'(Get-Item -Path "$env:PROGRAMFILES (x86)\Google\Chrome'
128-
r'\Application\chrome.exe")',
129-
r'(Get-Item -Path "$env:LOCALAPPDATA\Google\Chrome'
130-
r'\Application\chrome.exe")',
131-
),
216+
OSType.WIN: chrome_on_windows_path(),
132217
},
133218
ChromeType.MSEDGE: {
134-
OSType.LINUX: linux_browser_apps_to_cmd(
135-
"microsoft-edge-stable",
136-
"microsoft-edge",
137-
"microsoft-edge-beta",
138-
"microsoft-edge-dev",
139-
),
219+
OSType.LINUX: edge_on_linux_path(),
140220
OSType.MAC: r"/Applications/Microsoft Edge.app"
141221
r"/Contents/MacOS/Microsoft Edge",
142-
OSType.WIN: windows_browser_apps_to_cmd(
143-
# stable edge
144-
r'(Get-Item -Path "$env:PROGRAMFILES\Microsoft\Edge'
145-
r'\Application\msedge.exe")',
146-
r'(Get-Item -Path "$env:PROGRAMFILES (x86)\Microsoft'
147-
r'\Edge\Application\msedge.exe")',
148-
# beta edge
149-
r'(Get-Item -Path "$env:LOCALAPPDATA\Microsoft\Edge Beta'
150-
r'\Application\msedge.exe")',
151-
r'(Get-Item -Path "$env:PROGRAMFILES\Microsoft\Edge Beta'
152-
r'\Application\msedge.exe")',
153-
r'(Get-Item -Path "$env:PROGRAMFILES (x86)\Microsoft\Edge Beta'
154-
r'\Application\msedge.exe")',
155-
# dev edge
156-
r'(Get-Item -Path "$env:LOCALAPPDATA\Microsoft\Edge Dev'
157-
r'\Application\msedge.exe")',
158-
r'(Get-Item -Path "$env:PROGRAMFILES\Microsoft\Edge Dev'
159-
r'\Application\msedge.exe")',
160-
r'(Get-Item -Path "$env:PROGRAMFILES (x86)\Microsoft\Edge Dev'
161-
r'\Application\msedge.exe")',
162-
# canary edge
163-
r'(Get-Item -Path "$env:LOCALAPPDATA\Microsoft\Edge SxS'
164-
r'\Application\msedge.exe")',
165-
),
222+
OSType.WIN: edge_on_windows_path(),
166223
},
167224
}
168225
return cmd_mapping[browser_type][os_name()]
@@ -185,11 +242,11 @@ def get_browser_version_from_os(browser_type):
185242
cmd_mapping = {
186243
ChromeType.GOOGLE: {
187244
OSType.LINUX: linux_browser_apps_to_cmd(
188-
"google-chrome-stable",
189245
"google-chrome",
190-
"chrome",
191246
"chromium",
192247
"chromium-browser",
248+
"chrome",
249+
"google-chrome-stable",
193250
"google-chrome-beta",
194251
"google-chrome-dev",
195252
"google-chrome-unstable",
@@ -212,8 +269,8 @@ def get_browser_version_from_os(browser_type):
212269
},
213270
ChromeType.MSEDGE: {
214271
OSType.LINUX: linux_browser_apps_to_cmd(
215-
"microsoft-edge-stable",
216272
"microsoft-edge",
273+
"microsoft-edge-stable",
217274
"microsoft-edge-beta",
218275
"microsoft-edge-dev",
219276
),

seleniumbase/fixtures/constants.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,18 +360,18 @@ class ValidBrowsers:
360360

361361
class ValidBinaries:
362362
valid_chrome_binaries_on_linux = [
363-
"google-chrome-stable",
364363
"google-chrome",
365-
"chrome",
366364
"chromium",
367365
"chromium-browser",
366+
"chrome",
367+
"google-chrome-stable",
368368
"google-chrome-beta",
369369
"google-chrome-dev",
370370
"google-chrome-unstable",
371371
]
372372
valid_edge_binaries_on_linux = [
373-
"microsoft-edge-stable",
374373
"microsoft-edge",
374+
"microsoft-edge-stable",
375375
"microsoft-edge-beta",
376376
"microsoft-edge-dev",
377377
]

seleniumbase/undetected/__init__.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -502,15 +502,21 @@ def __hash__(self):
502502

503503

504504
def find_chrome_executable():
505+
from seleniumbase.core import detect_b_ver
506+
507+
binary_location = detect_b_ver.get_binary_location("google-chrome", True)
508+
if os.path.exists(binary_location) and os.access(binary_location, os.X_OK):
509+
return os.path.normpath(binary_location)
510+
505511
candidates = set()
506512
if IS_POSIX:
507513
for item in os.environ.get("PATH").split(os.pathsep):
508514
for subitem in (
509-
"google-chrome-stable",
510-
"google-chrome",
511-
"chrome",
512515
"chromium",
516+
"google-chrome",
513517
"chromium-browser",
518+
"chrome",
519+
"google-chrome-stable",
514520
"google-chrome-beta",
515521
"google-chrome-dev",
516522
"google-chrome-unstable",
@@ -542,3 +548,4 @@ def find_chrome_executable():
542548
for candidate in candidates:
543549
if os.path.exists(candidate) and os.access(candidate, os.X_OK):
544550
return os.path.normpath(candidate)
551+
return None # Browser not found!

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
'setuptools>=68.0.0;python_version>="3.7" and python_version<"3.8"',
141141
'setuptools>=68.1.2;python_version>="3.8"',
142142
'wheel>=0.37.1;python_version<"3.7"',
143-
'wheel>=0.41.1;python_version>="3.7"',
143+
'wheel>=0.41.2;python_version>="3.7"',
144144
'attrs==22.1.0;python_version<"3.7"',
145145
'attrs>=23.1.0;python_version>="3.7"',
146146
"certifi>=2023.7.22",

0 commit comments

Comments
 (0)