6
6
import subprocess
7
7
import sys
8
8
import time
9
+ import types
9
10
import urllib3
10
11
import warnings
11
12
from selenium import webdriver
22
23
from seleniumbase .core import detect_b_ver
23
24
from seleniumbase .core import download_helper
24
25
from seleniumbase .core import proxy_helper
26
+ from seleniumbase .core import sb_driver
25
27
from seleniumbase .fixtures import constants
26
28
from seleniumbase .fixtures import shared_utils
27
29
@@ -102,6 +104,66 @@ def make_driver_executable_if_not(driver_path):
102
104
make_executable (driver_path )
103
105
104
106
107
+ def extend_driver (driver ):
108
+ # Extend the driver with new methods
109
+ DM = sb_driver .DriverMethods (driver )
110
+ page = types .SimpleNamespace ()
111
+ page .open = DM .open_url
112
+ page .click = DM .click
113
+ page .send_keys = DM .send_keys
114
+ page .type = DM .update_text
115
+ page .assert_element = DM .assert_element_visible
116
+ page .assert_element_present = DM .assert_element_present
117
+ page .assert_element_not_visible = DM .assert_element_not_visible
118
+ page .assert_text = DM .assert_text
119
+ page .assert_exact_text = DM .assert_exact_text
120
+ page .wait_for_element = DM .wait_for_element
121
+ page .wait_for_text = DM .wait_for_text
122
+ page .wait_for_exact_text = DM .wait_for_exact_text
123
+ page .wait_for_and_accept_alert = DM .wait_for_and_accept_alert
124
+ page .wait_for_and_dismiss_alert = DM .wait_for_and_dismiss_alert
125
+ page .is_element_present = DM .is_element_present
126
+ page .is_element_visible = DM .is_element_visible
127
+ page .is_text_visible = DM .is_text_visible
128
+ page .is_exact_text_visible = DM .is_exact_text_visible
129
+ page .get_text = DM .get_text
130
+ driver .page = page
131
+ js = types .SimpleNamespace ()
132
+ js .js_click = DM .js_click
133
+ js .get_active_element_css = DM .get_active_element_css
134
+ js .get_locale_code = DM .get_locale_code
135
+ js .get_origin = DM .get_origin
136
+ js .get_user_agent = DM .get_user_agent
137
+ js .highlight = DM .highlight
138
+ driver .js = js
139
+ driver .open = DM .open_url
140
+ driver .click = DM .click
141
+ driver .send_keys = DM .send_keys
142
+ driver .type = DM .update_text
143
+ driver .assert_element = DM .assert_element_visible
144
+ driver .assert_element_present = DM .assert_element_present
145
+ driver .assert_element_not_visible = DM .assert_element_not_visible
146
+ driver .assert_text = DM .assert_text
147
+ driver .assert_exact_text = DM .assert_exact_text
148
+ driver .wait_for_element = DM .wait_for_element
149
+ driver .wait_for_text = DM .wait_for_text
150
+ driver .wait_for_exact_text = DM .wait_for_exact_text
151
+ driver .wait_for_and_accept_alert = DM .wait_for_and_accept_alert
152
+ driver .wait_for_and_dismiss_alert = DM .wait_for_and_dismiss_alert
153
+ driver .is_element_present = DM .is_element_present
154
+ driver .is_element_visible = DM .is_element_visible
155
+ driver .is_text_visible = DM .is_text_visible
156
+ driver .is_exact_text_visible = DM .is_exact_text_visible
157
+ driver .get_text = DM .get_text
158
+ driver .js_click = DM .js_click
159
+ driver .get_active_element_css = DM .get_active_element_css
160
+ driver .get_locale_code = DM .get_locale_code
161
+ driver .get_origin = DM .get_origin
162
+ driver .get_user_agent = DM .get_user_agent
163
+ driver .highlight = DM .highlight
164
+ return driver
165
+
166
+
105
167
@decorators .rate_limited (4 )
106
168
def requests_get (url , proxy_string = None ):
107
169
import requests
@@ -1607,10 +1669,11 @@ def get_remote_driver(
1607
1669
for key in extension_capabilities :
1608
1670
ext_caps = extension_capabilities
1609
1671
chrome_options .set_capability (key , ext_caps [key ])
1610
- return webdriver .Remote (
1672
+ driver = webdriver .Remote (
1611
1673
command_executor = address ,
1612
1674
options = chrome_options ,
1613
1675
)
1676
+ return extend_driver (driver )
1614
1677
elif browser_name == constants .Browser .FIREFOX :
1615
1678
firefox_options = _set_firefox_options (
1616
1679
downloads_path ,
@@ -1666,18 +1729,20 @@ def get_remote_driver(
1666
1729
for key in extension_capabilities :
1667
1730
ext_caps = extension_capabilities
1668
1731
firefox_options .set_capability (key , ext_caps [key ])
1669
- return webdriver .Remote (
1732
+ driver = webdriver .Remote (
1670
1733
command_executor = address ,
1671
1734
options = firefox_options ,
1672
1735
)
1736
+ return extend_driver (driver )
1673
1737
elif browser_name == constants .Browser .INTERNET_EXPLORER :
1674
1738
capabilities = webdriver .DesiredCapabilities .INTERNETEXPLORER
1675
1739
remote_options = ArgOptions ()
1676
1740
remote_options .set_capability ("cloud:options" , desired_caps )
1677
- return webdriver .Remote (
1741
+ driver = webdriver .Remote (
1678
1742
command_executor = address ,
1679
1743
options = remote_options ,
1680
1744
)
1745
+ return extend_driver (driver )
1681
1746
elif browser_name == constants .Browser .EDGE :
1682
1747
edge_options = _set_chrome_options (
1683
1748
browser_name ,
@@ -1767,26 +1832,29 @@ def get_remote_driver(
1767
1832
for key in extension_capabilities :
1768
1833
ext_caps = extension_capabilities
1769
1834
edge_options .set_capability (key , ext_caps [key ])
1770
- return webdriver .Remote (
1835
+ driver = webdriver .Remote (
1771
1836
command_executor = address ,
1772
1837
options = edge_options ,
1773
1838
)
1839
+ return extend_driver (driver )
1774
1840
elif browser_name == constants .Browser .SAFARI :
1775
1841
capabilities = webdriver .DesiredCapabilities .SAFARI
1776
1842
remote_options = ArgOptions ()
1777
1843
remote_options .set_capability ("cloud:options" , desired_caps )
1778
- return webdriver .Remote (
1844
+ driver = webdriver .Remote (
1779
1845
command_executor = address ,
1780
1846
options = remote_options ,
1781
1847
)
1848
+ return extend_driver (driver )
1782
1849
elif browser_name == constants .Browser .REMOTE :
1783
1850
remote_options = ArgOptions ()
1784
1851
for cap_name , cap_value in desired_caps .items ():
1785
1852
remote_options .set_capability (cap_name , cap_value )
1786
- return webdriver .Remote (
1853
+ driver = webdriver .Remote (
1787
1854
command_executor = address ,
1788
1855
options = remote_options ,
1789
1856
)
1857
+ return extend_driver (driver )
1790
1858
1791
1859
1792
1860
def get_local_driver (
@@ -1913,10 +1981,11 @@ def get_local_driver(
1913
1981
log_output = os .devnull ,
1914
1982
)
1915
1983
try :
1916
- return webdriver .Firefox (
1984
+ driver = webdriver .Firefox (
1917
1985
service = service ,
1918
1986
options = firefox_options ,
1919
1987
)
1988
+ return extend_driver (driver )
1920
1989
except BaseException as e :
1921
1990
if (
1922
1991
"geckodriver unexpectedly exited" in str (e )
@@ -1942,19 +2011,21 @@ def get_local_driver(
1942
2011
)
1943
2012
):
1944
2013
firefox_options .add_argument ("-headless" )
1945
- return webdriver .Firefox (
2014
+ driver = webdriver .Firefox (
1946
2015
service = service ,
1947
2016
options = firefox_options ,
1948
2017
)
2018
+ return extend_driver (driver )
1949
2019
else :
1950
2020
raise # Not an obvious fix.
1951
2021
else :
1952
2022
service = FirefoxService (log_output = os .devnull )
1953
2023
try :
1954
- return webdriver .Firefox (
2024
+ driver = webdriver .Firefox (
1955
2025
service = service ,
1956
2026
options = firefox_options ,
1957
2027
)
2028
+ return extend_driver (driver )
1958
2029
except BaseException as e :
1959
2030
if (
1960
2031
"geckodriver unexpectedly exited" in str (e )
@@ -1980,10 +2051,11 @@ def get_local_driver(
1980
2051
)
1981
2052
):
1982
2053
firefox_options .add_argument ("-headless" )
1983
- return webdriver .Firefox (
2054
+ driver = webdriver .Firefox (
1984
2055
service = service ,
1985
2056
options = firefox_options ,
1986
2057
)
2058
+ return extend_driver (driver )
1987
2059
else :
1988
2060
raise # Not an obvious fix.
1989
2061
elif browser_name == constants .Browser .INTERNET_EXPLORER :
@@ -2036,13 +2108,15 @@ def get_local_driver(
2036
2108
sys .argv = sys_args # Put back the original sys args
2037
2109
if not headless :
2038
2110
warnings .simplefilter ("ignore" , category = DeprecationWarning )
2039
- return webdriver .Ie (capabilities = ie_capabilities )
2111
+ driver = webdriver .Ie (capabilities = ie_capabilities )
2112
+ return extend_driver (driver )
2040
2113
else :
2041
2114
warnings .simplefilter ("ignore" , category = DeprecationWarning )
2042
- return webdriver .Ie (
2115
+ driver = webdriver .Ie (
2043
2116
executable_path = LOCAL_HEADLESS_IEDRIVER ,
2044
2117
capabilities = ie_capabilities ,
2045
2118
)
2119
+ return extend_driver (driver )
2046
2120
elif browser_name == constants .Browser .EDGE :
2047
2121
prefs = {
2048
2122
"download.default_directory" : downloads_path ,
@@ -2433,7 +2507,8 @@ def get_local_driver(
2433
2507
edge_options .add_argument (
2434
2508
"--remote-debugging-port=%s" % free_port
2435
2509
)
2436
- return Edge (service = service , options = edge_options )
2510
+ driver = Edge (service = service , options = edge_options )
2511
+ return extend_driver (driver )
2437
2512
if not auto_upgrade_edgedriver :
2438
2513
raise # Not an obvious fix.
2439
2514
else :
@@ -2463,7 +2538,7 @@ def get_local_driver(
2463
2538
service_args = ["--disable-build-check" ],
2464
2539
)
2465
2540
driver = Edge (service = service , options = edge_options )
2466
- return driver
2541
+ return extend_driver ( driver )
2467
2542
elif browser_name == constants .Browser .SAFARI :
2468
2543
args = " " .join (sys .argv )
2469
2544
if ("-n" in sys .argv or " -n=" in args or args == "-c" ):
@@ -2487,9 +2562,10 @@ def get_local_driver(
2487
2562
):
2488
2563
# Only change it if not "normal", which is the default.
2489
2564
options .page_load_strategy = settings .PAGE_LOAD_STRATEGY .lower ()
2490
- return webdriver .safari .webdriver .WebDriver (
2565
+ driver = webdriver .safari .webdriver .WebDriver (
2491
2566
service = service , options = options
2492
2567
)
2568
+ return extend_driver (driver )
2493
2569
elif browser_name == constants .Browser .GOOGLE_CHROME :
2494
2570
try :
2495
2571
chrome_options = _set_chrome_options (
@@ -3017,9 +3093,10 @@ def get_local_driver(
3017
3093
warnings .simplefilter (
3018
3094
"ignore" , category = DeprecationWarning
3019
3095
)
3020
- return webdriver .Chrome (
3096
+ driver = webdriver .Chrome (
3021
3097
service = service , options = chrome_options
3022
3098
)
3099
+ return extend_driver (driver )
3023
3100
if not auto_upgrade_chromedriver :
3024
3101
raise # Not an obvious fix.
3025
3102
else :
@@ -3136,11 +3213,11 @@ def get_local_driver(
3136
3213
driver .uc_open_with_reconnect = (
3137
3214
lambda url : uc_open_with_reconnect (driver , url )
3138
3215
)
3139
- driver .open = driver .get # Shortcut
3140
- return driver
3216
+ return extend_driver (driver )
3141
3217
else : # Running headless on Linux (and not using --uc)
3142
3218
try :
3143
- return webdriver .Chrome (options = chrome_options )
3219
+ driver = webdriver .Chrome (options = chrome_options )
3220
+ return extend_driver (driver )
3144
3221
except Exception as e :
3145
3222
if not hasattr (e , "msg" ):
3146
3223
raise
@@ -3159,9 +3236,10 @@ def get_local_driver(
3159
3236
warnings .simplefilter (
3160
3237
"ignore" , category = DeprecationWarning
3161
3238
)
3162
- return webdriver .Chrome (
3239
+ driver = webdriver .Chrome (
3163
3240
service = service , options = chrome_options
3164
3241
)
3242
+ return extend_driver (driver )
3165
3243
mcv = None # Major Chrome Version
3166
3244
if "Current browser version is " in e .msg :
3167
3245
line = e .msg .split ("Current browser version is " )[1 ]
@@ -3201,10 +3279,11 @@ def get_local_driver(
3201
3279
log_output = os .devnull ,
3202
3280
service_args = ["--disable-build-check" ],
3203
3281
)
3204
- return webdriver .Chrome (
3282
+ driver = webdriver .Chrome (
3205
3283
service = service ,
3206
3284
options = chrome_options ,
3207
3285
)
3286
+ return extend_driver (driver )
3208
3287
except Exception :
3209
3288
pass
3210
3289
# Use the virtual display on Linux during headless errors
@@ -3219,16 +3298,18 @@ def get_local_driver(
3219
3298
log_output = os .devnull ,
3220
3299
service_args = ["--disable-build-check" ]
3221
3300
)
3222
- return webdriver .Chrome (
3301
+ driver = webdriver .Chrome (
3223
3302
service = service , options = chrome_options
3224
3303
)
3304
+ return extend_driver (driver )
3225
3305
except Exception :
3226
3306
try :
3227
3307
# Try again if Chrome didn't launch
3228
3308
service = ChromeService (service_args = ["--disable-build-check" ])
3229
- return webdriver .Chrome (
3309
+ driver = webdriver .Chrome (
3230
3310
service = service , options = chrome_options
3231
3311
)
3312
+ return extend_driver (driver )
3232
3313
except Exception :
3233
3314
pass
3234
3315
if headless :
@@ -3245,7 +3326,8 @@ def get_local_driver(
3245
3326
log_output = os .devnull ,
3246
3327
service_args = ["--disable-build-check" ]
3247
3328
)
3248
- return webdriver .Chrome (service = service )
3329
+ driver = webdriver .Chrome (service = service )
3330
+ return extend_driver (driver )
3249
3331
else :
3250
3332
raise Exception (
3251
3333
"%s is not a valid browser option for this system!" % browser_name
0 commit comments