1919selenium4 = False
2020if sys .version_info [0 ] == 3 and sys .version_info [1 ] >= 7 :
2121 selenium4 = True
22+ from selenium .webdriver .common .options import ArgOptions
23+
2224DRIVER_DIR = os .path .dirname (os .path .realpath (drivers .__file__ ))
2325# Make sure that the SeleniumBase DRIVER_DIR is at the top of the System PATH
2426# (Changes to the System PATH with os.environ only last during the test run)
@@ -962,15 +964,28 @@ def get_remote_driver(
962964 device_height ,
963965 device_pixel_ratio ,
964966 )
965- capabilities = chrome_options .to_capabilities ()
967+ capabilities = None
968+ if selenium4 :
969+ capabilities = webdriver .ChromeOptions ().to_capabilities ()
970+ else :
971+ capabilities = chrome_options .to_capabilities ()
972+ # Set custom desired capabilities
966973 for key in desired_caps .keys ():
967974 capabilities [key ] = desired_caps [key ]
968- warnings .simplefilter ("ignore" , category = DeprecationWarning )
969- return webdriver .Remote (
970- command_executor = address ,
971- desired_capabilities = capabilities ,
972- keep_alive = True ,
973- )
975+ if selenium4 :
976+ chrome_options .set_capability ("cloud:options" , capabilities )
977+ return webdriver .Remote (
978+ command_executor = address ,
979+ options = chrome_options ,
980+ keep_alive = True ,
981+ )
982+ else :
983+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
984+ return webdriver .Remote (
985+ command_executor = address ,
986+ desired_capabilities = capabilities ,
987+ keep_alive = True ,
988+ )
974989 elif browser_name == constants .Browser .FIREFOX :
975990 firefox_options = _set_firefox_options (
976991 downloads_path ,
@@ -982,60 +997,115 @@ def get_remote_driver(
982997 firefox_arg ,
983998 firefox_pref ,
984999 )
985- capabilities = firefox_options .to_capabilities ()
1000+ capabilities = None
1001+ if selenium4 :
1002+ capabilities = webdriver .FirefoxOptions ().to_capabilities ()
1003+ else :
1004+ capabilities = firefox_options .to_capabilities ()
9861005 capabilities ["marionette" ] = True
9871006 if "linux" in PLATFORM :
9881007 if headless :
9891008 capabilities ["moz:firefoxOptions" ] = {"args" : ["-headless" ]}
1009+ # Set custom desired capabilities
9901010 for key in desired_caps .keys ():
9911011 capabilities [key ] = desired_caps [key ]
992- warnings .simplefilter ("ignore" , category = DeprecationWarning )
993- return webdriver .Remote (
994- command_executor = address ,
995- desired_capabilities = capabilities ,
996- keep_alive = True ,
997- )
1012+ if selenium4 :
1013+ firefox_options .set_capability ("cloud:options" , capabilities )
1014+ return webdriver .Remote (
1015+ command_executor = address ,
1016+ options = firefox_options ,
1017+ keep_alive = True ,
1018+ )
1019+ else :
1020+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1021+ return webdriver .Remote (
1022+ command_executor = address ,
1023+ desired_capabilities = capabilities ,
1024+ keep_alive = True ,
1025+ )
9981026 elif browser_name == constants .Browser .INTERNET_EXPLORER :
9991027 capabilities = webdriver .DesiredCapabilities .INTERNETEXPLORER
1000- for key in desired_caps .keys ():
1001- capabilities [key ] = desired_caps [key ]
1002- warnings .simplefilter ("ignore" , category = DeprecationWarning )
1003- return webdriver .Remote (
1004- command_executor = address ,
1005- desired_capabilities = capabilities ,
1006- keep_alive = True ,
1007- )
1028+ if selenium4 :
1029+ remote_options = ArgOptions ()
1030+ remote_options .set_capability ("cloud:options" , desired_caps )
1031+ return webdriver .Remote (
1032+ command_executor = address ,
1033+ options = remote_options ,
1034+ keep_alive = True ,
1035+ )
1036+ else :
1037+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1038+ for key in desired_caps .keys ():
1039+ capabilities [key ] = desired_caps [key ]
1040+ return webdriver .Remote (
1041+ command_executor = address ,
1042+ desired_capabilities = capabilities ,
1043+ keep_alive = True ,
1044+ )
10081045 elif browser_name == constants .Browser .EDGE :
10091046 capabilities = webdriver .DesiredCapabilities .EDGE
1010- for key in desired_caps .keys ():
1011- capabilities [key ] = desired_caps [key ]
1012- warnings .simplefilter ("ignore" , category = DeprecationWarning )
1013- return webdriver .Remote (
1014- command_executor = address ,
1015- desired_capabilities = capabilities ,
1016- keep_alive = True ,
1017- )
1047+ if selenium4 :
1048+ remote_options = ArgOptions ()
1049+ remote_options .set_capability ("cloud:options" , desired_caps )
1050+ return webdriver .Remote (
1051+ command_executor = address ,
1052+ options = remote_options ,
1053+ keep_alive = True ,
1054+ )
1055+ else :
1056+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1057+ for key in desired_caps .keys ():
1058+ capabilities [key ] = desired_caps [key ]
1059+ return webdriver .Remote (
1060+ command_executor = address ,
1061+ desired_capabilities = capabilities ,
1062+ keep_alive = True ,
1063+ )
10181064 elif browser_name == constants .Browser .SAFARI :
10191065 capabilities = webdriver .DesiredCapabilities .SAFARI
1020- for key in desired_caps .keys ():
1021- capabilities [key ] = desired_caps [key ]
1022- warnings .simplefilter ("ignore" , category = DeprecationWarning )
1023- return webdriver .Remote (
1024- command_executor = address ,
1025- desired_capabilities = capabilities ,
1026- keep_alive = True ,
1027- )
1066+ if selenium4 :
1067+ remote_options = ArgOptions ()
1068+ remote_options .set_capability ("cloud:options" , desired_caps )
1069+ return webdriver .Remote (
1070+ command_executor = address ,
1071+ options = remote_options ,
1072+ keep_alive = True ,
1073+ )
1074+ else :
1075+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1076+ for key in desired_caps .keys ():
1077+ capabilities [key ] = desired_caps [key ]
1078+ return webdriver .Remote (
1079+ command_executor = address ,
1080+ desired_capabilities = capabilities ,
1081+ keep_alive = True ,
1082+ )
10281083 elif browser_name == constants .Browser .OPERA :
10291084 capabilities = webdriver .DesiredCapabilities .OPERA
1030- for key in desired_caps .keys ():
1031- capabilities [key ] = desired_caps [key ]
1032- warnings .simplefilter ("ignore" , category = DeprecationWarning )
1033- return webdriver .Remote (
1034- command_executor = address ,
1035- desired_capabilities = capabilities ,
1036- keep_alive = True ,
1037- )
1085+ if selenium4 :
1086+ remote_options = ArgOptions ()
1087+ remote_options .set_capability ("cloud:options" , desired_caps )
1088+ return webdriver .Remote (
1089+ command_executor = address ,
1090+ options = remote_options ,
1091+ keep_alive = True ,
1092+ )
1093+ else :
1094+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1095+ for key in desired_caps .keys ():
1096+ capabilities [key ] = desired_caps [key ]
1097+ return webdriver .Remote (
1098+ command_executor = address ,
1099+ desired_capabilities = capabilities ,
1100+ keep_alive = True ,
1101+ )
10381102 elif browser_name == constants .Browser .PHANTOM_JS :
1103+ if selenium4 :
1104+ message = (
1105+ "\n "
1106+ "PhantomJS is no longer available for Selenium 4!\n "
1107+ 'Try using "--headless" mode with Chrome instead!' )
1108+ raise Exception (message )
10391109 capabilities = webdriver .DesiredCapabilities .PHANTOMJS
10401110 for key in desired_caps .keys ():
10411111 capabilities [key ] = desired_caps [key ]
@@ -1049,37 +1119,77 @@ def get_remote_driver(
10491119 )
10501120 elif browser_name == constants .Browser .ANDROID :
10511121 capabilities = webdriver .DesiredCapabilities .ANDROID
1052- for key in desired_caps .keys ():
1053- capabilities [key ] = desired_caps [key ]
1054- return webdriver .Remote (
1055- command_executor = address ,
1056- desired_capabilities = capabilities ,
1057- keep_alive = True ,
1058- )
1122+ if selenium4 :
1123+ remote_options = ArgOptions ()
1124+ remote_options .set_capability ("cloud:options" , desired_caps )
1125+ return webdriver .Remote (
1126+ command_executor = address ,
1127+ options = remote_options ,
1128+ keep_alive = True ,
1129+ )
1130+ else :
1131+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1132+ for key in desired_caps .keys ():
1133+ capabilities [key ] = desired_caps [key ]
1134+ return webdriver .Remote (
1135+ command_executor = address ,
1136+ desired_capabilities = capabilities ,
1137+ keep_alive = True ,
1138+ )
10591139 elif browser_name == constants .Browser .IPHONE :
10601140 capabilities = webdriver .DesiredCapabilities .IPHONE
1061- for key in desired_caps .keys ():
1062- capabilities [key ] = desired_caps [key ]
1063- return webdriver .Remote (
1064- command_executor = address ,
1065- desired_capabilities = capabilities ,
1066- keep_alive = True ,
1067- )
1141+ if selenium4 :
1142+ remote_options = ArgOptions ()
1143+ remote_options .set_capability ("cloud:options" , desired_caps )
1144+ return webdriver .Remote (
1145+ command_executor = address ,
1146+ options = remote_options ,
1147+ keep_alive = True ,
1148+ )
1149+ else :
1150+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1151+ for key in desired_caps .keys ():
1152+ capabilities [key ] = desired_caps [key ]
1153+ return webdriver .Remote (
1154+ command_executor = address ,
1155+ desired_capabilities = capabilities ,
1156+ keep_alive = True ,
1157+ )
10681158 elif browser_name == constants .Browser .IPAD :
10691159 capabilities = webdriver .DesiredCapabilities .IPAD
1070- for key in desired_caps .keys ():
1071- capabilities [key ] = desired_caps [key ]
1072- return webdriver .Remote (
1073- command_executor = address ,
1074- desired_capabilities = capabilities ,
1075- keep_alive = True ,
1076- )
1160+ if selenium4 :
1161+ remote_options = ArgOptions ()
1162+ remote_options .set_capability ("cloud:options" , desired_caps )
1163+ return webdriver .Remote (
1164+ command_executor = address ,
1165+ options = remote_options ,
1166+ keep_alive = True ,
1167+ )
1168+ else :
1169+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1170+ for key in desired_caps .keys ():
1171+ capabilities [key ] = desired_caps [key ]
1172+ return webdriver .Remote (
1173+ command_executor = address ,
1174+ desired_capabilities = capabilities ,
1175+ keep_alive = True ,
1176+ )
10771177 elif browser_name == constants .Browser .REMOTE :
1078- return webdriver .Remote (
1079- command_executor = address ,
1080- desired_capabilities = desired_caps ,
1081- keep_alive = True ,
1082- )
1178+ if selenium4 :
1179+ remote_options = ArgOptions ()
1180+ remote_options .set_capability ("cloud:options" , desired_caps )
1181+ return webdriver .Remote (
1182+ command_executor = address ,
1183+ options = remote_options ,
1184+ keep_alive = True ,
1185+ )
1186+ else :
1187+ warnings .simplefilter ("ignore" , category = DeprecationWarning )
1188+ return webdriver .Remote (
1189+ command_executor = address ,
1190+ desired_capabilities = desired_caps ,
1191+ keep_alive = True ,
1192+ )
10831193
10841194
10851195def get_local_driver (
@@ -1559,6 +1669,12 @@ def get_local_driver(
15591669 except Exception :
15601670 return webdriver .Opera ()
15611671 elif browser_name == constants .Browser .PHANTOM_JS :
1672+ if selenium4 :
1673+ message = (
1674+ "\n "
1675+ "PhantomJS is no longer available for Selenium 4!\n "
1676+ 'Try using "--headless" mode with Chrome instead!' )
1677+ raise Exception (message )
15621678 with warnings .catch_warnings ():
15631679 # Ignore "PhantomJS has been deprecated" UserWarning
15641680 warnings .simplefilter ("ignore" , category = UserWarning )
0 commit comments