@@ -11,7 +11,6 @@ def __init__(self):
11
11
class options : # webdriver.Chrome or uc.Chrome options
12
12
def __init__ (self ):
13
13
self .options = None
14
- self .device = self .device ()
15
14
self .browser = self .browser ()
16
15
self .extensions = self .extensions ()
17
16
@@ -32,7 +31,6 @@ def set(self, options, options_profile: dict or None):
32
31
33
32
extensions_used = profile ["extensions" ]
34
33
35
- self .device .set (self .options , option_device_profile = profile ["device" ])
36
34
self .browser .set (self .options , option_browser_profile = profile ["browser" ],
37
35
extensions_used = extensions_used , adb = profile ["adb" ])
38
36
self .extensions .set (self .options , option_extension_profile = profile ["extensions" ], incognito = incognito )
@@ -41,40 +39,8 @@ def set(self, options, options_profile: dict or None):
41
39
# noinspection PyTypeChecker
42
40
self .adb_remote (self .options , enabled = profile ["adb" ], package = profile ["adb_package" ],
43
41
use_running_app = profile ["use_running_app" ])
44
-
45
42
return self .options
46
43
47
- class device :
48
- def __init__ (self ):
49
- self .options = None
50
-
51
- # noinspection PyTypeChecker
52
- def set (self ,options , option_device_profile :None or dict ):
53
- if option_device_profile :
54
- # noinspection PyShadowingNames
55
- profile = defaultdict (lambda : None )
56
- profile .update (option_device_profile )
57
- self .options = options
58
-
59
- self .useragent (self .options ,useragent = profile ["useragent" ])
60
- self .mobile (self .options ,enabled = profile ["mobile" ])
61
- return self .options
62
- def useragent (self , options , useragent :str = None ):
63
- # gets overwritten by cdp, if cdp used
64
- if useragent :
65
- options .add_argument ('--user-agent=' + useragent )
66
-
67
- return options
68
-
69
- def mobile (self , options , enabled :bool or None = False ):
70
- # not sure, if it changes anything?
71
- if enabled :
72
- options .add_argument ('--enable-features=enable-nacl' )
73
- options .add_argument ('--arc-availability=officially-supported' )
74
- options .add_argument ('--force-device-ownership' )
75
- options .add_argument ('--use-mobile-user-agent' )
76
- return options
77
-
78
44
79
45
class browser :
80
46
def __init__ (self ):
@@ -96,7 +62,6 @@ def set(self, options, option_browser_profile: dict or None, extensions_used:boo
96
62
self .touch (self .options ,enabled = profile ["touch" ])
97
63
self .app (self .options , enabled = profile ["app" ])
98
64
self .gpu (self .options , enabled = profile ["gpu" ], adb = adb )
99
- self .mobile_view (self .options , enabled = profile ["mobile_view" ])
100
65
self .proxy (self .options , proxy = profile ["proxy" ], method = profile ["proxy_method" ])
101
66
return self .options
102
67
@@ -159,15 +124,9 @@ def gpu(self, options, enabled=False, adb:bool=None):
159
124
warnings .warn ('Disabling gpu not supported with android.' )
160
125
return options
161
126
162
- def mobile_view (self , options , enabled :bool = False ):
163
- if enabled :
164
- options .add_argument ('--enable-touchview' )
165
- warnings .warn ('--enable-touchview doesn\t seem to change anything' )
166
- return options
167
-
168
127
def proxy (self ,options , proxy :str = None , method :str = 'socks5://' ):
169
128
if not method :
170
- method = "' socks5://' "
129
+ method = "socks5://"
171
130
if proxy :
172
131
options .add_argument ('--proxy-server=' + method + proxy )
173
132
print ('proxy= "' + method + proxy + '"' )
@@ -220,7 +179,7 @@ def add_extension(self, options, extension_paths:None or list, incognito:bool =
220
179
if incognito :
221
180
warnings .warn ('Incognito might not be compatible with extensions' )
222
181
for extension_path in extension_paths :
223
- if extension_path [- 4 :] == ".crx" or extension_path [- 3 :] == ".zip" :
182
+ if extension_path [- 4 :] == ".crx" or extension_path [- 4 :] == ".zip" :
224
183
options .add_extension (extension_path )
225
184
else :
226
185
options .add_argument ('--load-extension=' + extension_path )
@@ -255,7 +214,7 @@ def set(self, driver, cdp_profile:bool or None = None):
255
214
browser = self .browser .set (driver , profile ["browser" ], mobile = mobile )
256
215
touchpoints = self .set_touchpoints (driver , enabled = profile ["touch" ], maxpoints = profile ["maxtouchpoints" ])
257
216
emulation = self .set_emulation (driver , profile ["emulation" ])
258
- useragent = self .set_useragent (driver , profile ["useragent" ])
217
+ useragent = self .set_useragent (driver , profile ["useragent" ], patch_version = profile [ "patch_version" ] )
259
218
260
219
cdp_args = profile ["cdp_args" ]
261
220
cdp_args_return = []
@@ -269,11 +228,61 @@ def set(self, driver, cdp_profile:bool or None = None):
269
228
return {"browser" : browser , "touchpoints" : touchpoints , "emulation" : emulation , "useragent" : useragent ,
270
229
"cdp_args" : cdp_args_return }
271
230
272
- def set_useragent (self , driver , useragent :dict = None ):
231
+ def set_useragent (self , driver , useragent :dict = None , patch_version : str or bool = None ):
273
232
from selenium_profiles .scripts .cdp_tools import cdp_tools
274
233
cdp_tools = cdp_tools (driver )
234
+ useragent = self .patch_version (useragent_profile = useragent , version = patch_version , driver = driver )
275
235
if useragent :
276
- return cdp_tools .set_useragent (useragent = useragent ) #todo makes detected..?
236
+ return cdp_tools .set_useragent (useragent = useragent )
237
+
238
+ def patch_version (self ,useragent_profile : dict , version : str or True = True , driver = None ):
239
+ profile = defaultdict (lambda :None )
240
+ profile .update (useragent_profile )
241
+
242
+ if version is True :
243
+ if driver :
244
+ useragent = driver .execute_script ("return navigator.userAgent" )
245
+ import re
246
+ version = re .findall ("(?<=Chrome/)\d+(?:\.\d+)+|(?<=Chromium/)\d+(?:\.\d+)+" , useragent )
247
+ if len (version ) != 1 :
248
+ raise LookupError ("Couldn't find Chrome-version in: " + useragent )
249
+ else :
250
+ version = version [0 ]
251
+ else :
252
+ raise ValueError ("driver needs to be specified to automatically get the Version" )
253
+
254
+
255
+ if profile ["userAgent" ]:
256
+ import re
257
+ profile ["userAgent" ] = re .sub ("(?<=Chrome/)\d+(?:\.\d+)+|(?<=Chromium/)\d+(?:\.\d+)+" ,
258
+ version .split ("." )[0 ] + ".0.0.0" , profile ["userAgent" ])
259
+
260
+ if profile ["userAgentMetadata" ]:
261
+ metadata = defaultdict (lambda :None )
262
+ metadata .update (profile ["userAgentMetadata" ])
263
+
264
+ if metadata ["brands" ]:
265
+ brands = []
266
+ for brand in metadata ["brands" ]:
267
+ brand ["version" ] = version .split ("." )[0 ]
268
+ brands .append (brand )
269
+ metadata ["brands" ] = brands
270
+
271
+ if metadata ["fullVersionList" ]:
272
+ version_list = []
273
+ for i in metadata ["fullVersionList" ]:
274
+ i ["version" ] = version
275
+ version_list .append (i )
276
+ metadata ["fullVersionList" ] = version_list
277
+
278
+ if metadata ["fullVersion" ]:
279
+ metadata ["fullVersion" ] = version
280
+
281
+ profile ["userAgentMetadata" ] = metadata
282
+
283
+ return profile
284
+
285
+
277
286
def set_emulation (self , driver , emulation :dict = None ):
278
287
from selenium_profiles .scripts .cdp_tools import cdp_tools
279
288
cdp_tools = cdp_tools (driver )
@@ -328,14 +337,14 @@ def exec_js_evaluators(profile: dict, driver, cdp_tools=None):
328
337
do_return = True
329
338
330
339
# noinspection PyBroadException
331
- try :
332
- platform = profile ["cdp" ]["useragent" ]["platform" ]
333
- except :
334
- platform = None
340
+ # try:
341
+ # platform = profile["cdp"]["useragent"]["platform"]
342
+ # except :
343
+ # platform = None
335
344
336
345
337
346
#if platform:
338
347
# cdp_tools.define_prop_on_new_document("navigator", "platform", platform) # will be different in workers:/
339
348
340
349
if do_return :
341
- return cdp_tools .evaluate_on_document_identifiers
350
+ return cdp_tools .evaluate_on_document_identifiers
0 commit comments