Drop support for Python 3.6 and Opera

This commit is contained in:
Michael Mintz 2023-09-01 18:36:15 -04:00
parent f76d81d500
commit f693fd13cc
13 changed files with 392 additions and 1042 deletions

View File

@ -70,7 +70,7 @@ sbase get chromedriver -p
```
(Drivers: ``chromedriver``, ``geckodriver``, ``edgedriver``,
``iedriver``, ``operadriver``, ``uc_driver``)
``iedriver``, ``uc_driver``)
(Options: A specific driver version or major version integer.
If not set, the driver version matches the browser.

View File

@ -130,7 +130,7 @@ def show_install_usage():
print(" OR: sbase install [DRIVER_NAME] [OPTIONS]")
print(" OR: sbase get [DRIVER_NAME] [OPTIONS]")
print(" (Drivers: chromedriver, geckodriver, edgedriver")
print(" iedriver, operadriver, uc_driver)")
print(" iedriver, uc_driver)")
print(" Options:")
print(" VERSION Specify the version to download.")
print(" Tries to detect the needed version.")

View File

@ -3,7 +3,7 @@ Downloads the specified webdriver to "seleniumbase/drivers/"
Usage:
sbase get {chromedriver|geckodriver|edgedriver|
iedriver|operadriver} [OPTIONS]
iedriver|uc_driver} [OPTIONS]
Options:
VERSION Specify the version.
Tries to detect the needed version.
@ -16,6 +16,8 @@ Examples:
sbase get edgedriver
sbase get chromedriver 114
sbase get chromedriver 114.0.5735.90
sbase get chromedriver stable
sbase get chromedriver beta
sbase get chromedriver -p
Output:
Downloads the webdriver to seleniumbase/drivers/
@ -50,7 +52,6 @@ LOCAL_PATH = "/usr/local/bin/" # On Mac and Linux systems
DEFAULT_CHROMEDRIVER_VERSION = "114.0.5735.90" # (If can't find LATEST_STABLE)
DEFAULT_GECKODRIVER_VERSION = "v0.33.0"
DEFAULT_EDGEDRIVER_VERSION = "115.0.1901.183" # (If can't find LATEST_STABLE)
DEFAULT_OPERADRIVER_VERSION = "v.96.0.4664.45"
def invalid_run_command():
@ -61,7 +62,7 @@ def invalid_run_command():
exp += " OR seleniumbase get [DRIVER] [OPTIONS]\n"
exp += " OR sbase get [DRIVER] [OPTIONS]\n"
exp += " (Drivers: chromedriver, geckodriver, edgedriver,\n"
exp += " iedriver, operadriver, uc_driver)\n"
exp += " iedriver, uc_driver)\n"
exp += " Options:\n"
exp += " VERSION Specify the version.\n"
exp += " Tries to detect the needed version.\n"
@ -287,7 +288,6 @@ def main(override=None, intel_for_uc=None, force_uc=None):
downloads_folder = DRIVER_DIR
expected_contents = None
platform_code = None
inner_folder = None
copy_to_path = False
latest_version = ""
use_version = ""
@ -717,7 +717,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
else:
raise Exception(
"Sorry! IEDriver is only for "
"Windows-based operating systems!"
"Windows-based systems!"
)
download_url = (
"https://selenium-release.storage.googleapis.com/"
@ -736,71 +736,6 @@ def main(override=None, intel_for_uc=None, force_uc=None):
msg = c2 + "HeadlessIEDriver to download" + cr
p_version = c3 + headless_ie_version + cr
log_d("\n*** %s = %s" % (msg, p_version))
elif name == "operadriver" or name == "operachromiumdriver":
name = "operadriver"
use_version = DEFAULT_OPERADRIVER_VERSION
get_latest = False
if num_args == 4 or num_args == 5:
if "-p" not in sys.argv[3].lower():
use_version = sys.argv[3]
if use_version.lower() == "latest":
use_version = DEFAULT_OPERADRIVER_VERSION
else:
copy_to_path = True
if num_args == 5:
if "-p" in sys.argv[4].lower():
copy_to_path = True
else:
invalid_run_command()
if IS_MAC:
file_name = "operadriver_mac64.zip"
platform_code = "mac64"
inner_folder = "operadriver_%s/" % platform_code
expected_contents = [
"operadriver_mac64/",
"operadriver_mac64/operadriver",
"operadriver_mac64/sha512_sum",
]
elif IS_LINUX:
file_name = "operadriver_linux64.zip"
platform_code = "linux64"
inner_folder = "operadriver_%s/" % platform_code
expected_contents = [
"operadriver_linux64/",
"operadriver_linux64/operadriver",
"operadriver_linux64/sha512_sum",
]
elif IS_WINDOWS and "64" in ARCH:
file_name = "operadriver_win64.zip"
platform_code = "win64"
inner_folder = "operadriver_%s/" % platform_code
expected_contents = [
"operadriver_win64/",
"operadriver_win64/operadriver.exe",
"operadriver_win64/sha512_sum",
]
elif IS_WINDOWS:
file_name = "operadriver_win32.zip"
platform_code = "win32"
inner_folder = "operadriver_%s/" % platform_code
expected_contents = [
"operadriver_win32/",
"operadriver_win32/operadriver.exe",
"operadriver_win32/sha512_sum",
]
else:
raise Exception(
"Cannot determine which version of Operadriver to download!"
)
download_url = (
"https://github.com/operasoftware/operachromiumdriver/"
"releases/download/"
"%s/%s" % (use_version, file_name)
)
msg = c2 + "operadriver to download" + cr
p_version = c3 + use_version + cr
log_d("\n*** %s = %s" % (msg, p_version))
else:
invalid_run_command()
@ -1095,60 +1030,6 @@ def main(override=None, intel_for_uc=None, force_uc=None):
make_executable(path_file)
log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
log_d("")
elif name == "operadriver":
if len(contents) > 3:
raise Exception("Unexpected content in OperaDriver Zip file!")
# Zip file is valid. Proceed.
driver_path = None
driver_file = None
for f_name in contents:
# Remove existing version if exists
str_name = str(f_name).split(inner_folder)[1]
new_file = os.path.join(downloads_folder, str_name)
if str_name == "operadriver" or str_name == "operadriver.exe":
driver_file = str_name
driver_path = new_file
if os.path.exists(new_file):
os.remove(new_file)
if not driver_file or not driver_path:
raise Exception("Operadriver missing from Zip file!")
log_d("Extracting %s from %s ..." % (contents, file_name))
zip_ref.extractall(downloads_folder)
zip_ref.close()
os.remove(zip_file_path)
log_d("%sUnzip Complete!%s\n" % (c2, cr))
inner_driver = os.path.join(
downloads_folder, inner_folder, driver_file
)
inner_sha = os.path.join(
downloads_folder, inner_folder, "sha512_sum"
)
shutil.copyfile(inner_driver, driver_path)
pr_driver_path = c3 + driver_path + cr
log_d(
"The file [%s] was saved to:\n%s\n"
% (driver_file, pr_driver_path)
)
log_d("Making [%s %s] executable ..." % (driver_file, use_version))
make_executable(driver_path)
log_d(
"%s[%s %s] is now ready for use!%s"
% (c1, driver_file, use_version, cr)
)
if copy_to_path and os.path.exists(LOCAL_PATH):
path_file = LOCAL_PATH + driver_file
shutil.copyfile(driver_path, path_file)
make_executable(path_file)
log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
# Clean up extra files
if os.path.exists(inner_driver):
os.remove(inner_driver)
if os.path.exists(inner_sha):
os.remove(inner_sha)
if os.path.exists(os.path.join(downloads_folder, inner_folder)):
# Only works if the directory is empty
os.rmdir(os.path.join(downloads_folder, inner_folder))
log_d("")
elif len(contents) == 0:
raise Exception("Zip file %s is empty!" % zip_file_path)
else:

File diff suppressed because it is too large Load Diff

View File

@ -103,9 +103,6 @@ def get_driver_name_and_version(driver, browser):
elif driver.capabilities["browserName"].lower() == "msedge":
cap_dict = driver.capabilities["msedge"]
return ("msedgedriver", cap_dict["msedgedriverVersion"].split(" ")[0])
elif driver.capabilities["browserName"].lower() == "opera":
cap_dict = driver.capabilities["opera"]
return ("operadriver", cap_dict["operadriverVersion"].split(" ")[0])
elif driver.capabilities["browserName"].lower() == "firefox":
return ("geckodriver", driver.capabilities["moz:geckodriverVersion"])
elif browser == "safari":

View File

@ -95,9 +95,6 @@ python3_11_or_newer = False
if sys.version_info >= (3, 11):
python3_11_or_newer = True
py311_patch2 = constants.PatchPy311.PATCH
selenium4_or_newer = False
if sys.version_info >= (3, 7):
selenium4_or_newer = True
class BaseCase(unittest.TestCase):
@ -226,7 +223,7 @@ class BaseCase(unittest.TestCase):
if not self.__looks_like_a_page_url(url):
# url should start with one of the following:
# "http:", "https:", "://", "data:", "file:",
# "about:", "chrome:", "opera:", or "edge:".
# "about:", "chrome:", or "edge:".
if page_utils.is_valid_url("https://" + url):
url = "https://" + url
else:
@ -286,14 +283,7 @@ class BaseCase(unittest.TestCase):
else:
raise
elif "Timed out receiving message from renderer" in e.msg:
page_load_timeout = None
if selenium4_or_newer:
page_load_timeout = self.driver.timeouts.page_load
else:
if hasattr(settings, "PAGE_LOAD_TIMEOUT"):
page_load_timeout = settings.PAGE_LOAD_TIMEOUT
else:
page_load_timeout = 120
page_load_timeout = self.driver.timeouts.page_load
logging.info(
"The page load timed out after %s seconds! Will retry..."
% page_load_timeout
@ -3556,18 +3546,13 @@ class BaseCase(unittest.TestCase):
def open_new_window(self, switch_to=True):
"""Opens a new browser tab/window and switches to it by default."""
self.wait_for_ready_state_complete()
if selenium4_or_newer and switch_to:
if switch_to:
self.driver.switch_to.new_window("tab")
else:
self.driver.execute_script("window.open('');")
time.sleep(0.01)
if self.browser == "safari":
self.wait_for_ready_state_complete()
if switch_to and not selenium4_or_newer:
self.switch_to_newest_window()
time.sleep(0.01)
if self.browser == "safari":
self.wait_for_ready_state_complete()
def switch_to_window(self, window, timeout=None):
"""Switches control of the browser to the specified window.
@ -3953,18 +3938,6 @@ class BaseCase(unittest.TestCase):
self.driver.set_window_rect(10, 20, width, height)
except Exception:
pass
elif self.browser == "opera":
if self.maximize_option:
try:
self.driver.maximize_window()
self.wait_for_ready_state_complete()
except Exception:
pass # Keep existing browser resolution
else:
try:
self.driver.set_window_rect(10, 20, width, height)
except Exception:
pass
if self.start_page and len(self.start_page) >= 4:
if page_utils.is_valid_url(self.start_page):
self.open(self.start_page)
@ -7345,11 +7318,11 @@ class BaseCase(unittest.TestCase):
return online
def is_chromium(self):
"""Return True if the browser is Chrome, Edge, or Opera."""
"""Return True if the browser is Chrome or Edge."""
self.__check_scope()
chromium = False
browser_name = self.driver.capabilities["browserName"]
if browser_name.lower() in ("chrome", "edge", "msedge", "opera"):
if browser_name.lower() in ("chrome", "edge", "msedge"):
chromium = True
return chromium
@ -12635,23 +12608,12 @@ class BaseCase(unittest.TestCase):
if self.__needs_minimum_wait():
time.sleep(0.05)
try:
if selenium4_or_newer and not center:
if not center:
element_rect = element.rect
left_offset = element_rect["width"] / 2
top_offset = element_rect["height"] / 2
x = -left_offset + (math.ceil(float(x)) or 0)
y = -top_offset + (math.ceil(float(y)) or 0)
elif selenium4_or_newer and center:
pass
elif not selenium4_or_newer and not center:
pass
else:
# not selenium4_or_newer and center:
element_rect = element.rect
left_offset = element_rect["width"] / 2
top_offset = element_rect["height"] / 2
x = left_offset + x
y = top_offset + y
action_chains = ActionChains(self.driver)
action_chains.move_to_element_with_offset(element, x, y)
if not double:
@ -12931,7 +12893,6 @@ class BaseCase(unittest.TestCase):
or url.startswith("data:")
or url.startswith("edge:")
or url.startswith("file:")
or url.startswith("opera:")
or url.startswith("view-source:")
):
return True
@ -13219,8 +13180,7 @@ class BaseCase(unittest.TestCase):
for selector_part in selectors[1:]:
shadow_root = None
if (
selenium4_or_newer
and (self.is_chromium() or self.browser == "firefox")
(self.is_chromium() or self.browser == "firefox")
and int(self.__get_major_browser_version()) >= 96
):
try:
@ -13289,8 +13249,7 @@ class BaseCase(unittest.TestCase):
selector_chain += selector_part
try:
if (
selenium4_or_newer
and (self.is_chromium() or self.browser == "firefox")
(self.is_chromium() or self.browser == "firefox")
and int(self.__get_major_browser_version()) >= 96
):
if timeout == 0.1:
@ -14123,7 +14082,7 @@ class BaseCase(unittest.TestCase):
"Chrome/89.0.4389.105 Mobile Safari/537.36"
)
if self.browser in ["firefox", "ie", "safari", "opera"]:
if self.browser in ["firefox", "ie", "safari"]:
# The Recorder Mode browser extension is only for Chrome/Edge.
if self.recorder_mode:
message = (
@ -14255,9 +14214,7 @@ class BaseCase(unittest.TestCase):
d_height=self.__device_height,
d_p_r=self.__device_pixel_ratio,
)
if selenium4_or_newer and self.driver.timeouts.implicit_wait > 0:
self.driver.implicitly_wait(0)
elif not selenium4_or_newer:
if self.driver.timeouts.implicit_wait > 0:
self.driver.implicitly_wait(0)
self._default_driver = self.driver
if self._reuse_session:
@ -14268,7 +14225,7 @@ class BaseCase(unittest.TestCase):
self._drivers_list.append(self.driver)
self._drivers_browser_map[self.driver] = self.browser
if self.browser in ["firefox", "ie", "safari", "opera"]:
if self.browser in ["firefox", "ie", "safari"]:
# Only Chrome and Edge browsers have the mobile emulator.
# Some actions such as hover-clicking are different on mobile.
self.mobile_emulator = False
@ -15174,11 +15131,6 @@ class BaseCase(unittest.TestCase):
return (
"msedgedriver", cap_dict["msedgedriverVersion"].split(" ")[0]
)
elif driver.capabilities["browserName"].lower() == "opera":
cap_dict = driver.capabilities["opera"]
return (
"operadriver", cap_dict["operadriverVersion"].split(" ")[0]
)
elif driver.capabilities["browserName"].lower() == "firefox":
return (
"geckodriver", driver.capabilities["moz:geckodriverVersion"]

View File

@ -352,7 +352,6 @@ class ValidBrowsers:
"edge",
"firefox",
"ie",
"opera",
"safari",
"remote",
]
@ -397,7 +396,6 @@ class Browser:
EDGE = "edge"
FIREFOX = "firefox"
INTERNET_EXPLORER = "ie"
OPERA = "opera"
SAFARI = "safari"
REMOTE = "remote"
@ -406,7 +404,6 @@ class Browser:
"edge": None,
"firefox": None,
"ie": None,
"opera": None,
"safari": None,
"remote": None,
}
@ -416,7 +413,6 @@ class Browser:
"edge": None,
"firefox": None,
"ie": None,
"opera": None,
"safari": None,
"remote": None,
}

View File

@ -122,7 +122,6 @@ def is_valid_url(url):
or url.startswith("data:")
or url.startswith("edge:")
or url.startswith("file:")
or url.startswith("opera:")
):
return True
else:

View File

@ -145,10 +145,6 @@ def Driver(
browser_changes += 1
browser_set = "firefox"
browser_list.append("--browser=firefox")
if "--browser=opera" in sys_argv or "--browser opera" in sys_argv:
browser_changes += 1
browser_set = "opera"
browser_list.append("--browser=opera")
if "--browser=safari" in sys_argv or "--browser safari" in sys_argv:
browser_changes += 1
browser_set = "safari"
@ -178,10 +174,6 @@ def Driver(
browser_changes += 1
browser_text = "ie"
browser_list.append("--ie")
if "--opera" in sys_argv and not browser_set == "opera":
browser_changes += 1
browser_text = "opera"
browser_list.append("--opera")
if "--safari" in sys_argv and not browser_set == "safari":
browser_changes += 1
browser_text = "safari"

View File

@ -166,13 +166,6 @@ def pytest_addoption(parser):
default=False,
help="""Shortcut for --browser=ie""",
)
parser.addoption(
"--opera",
action="store_true",
dest="use_opera",
default=False,
help="""Shortcut for --browser=opera""",
)
parser.addoption(
"--safari",
action="store_true",
@ -1315,10 +1308,6 @@ def pytest_addoption(parser):
browser_changes += 1
browser_set = "firefox"
browser_list.append("--browser=firefox")
if "--browser=opera" in sys_argv or "--browser opera" in sys_argv:
browser_changes += 1
browser_set = "opera"
browser_list.append("--browser=opera")
if "--browser=safari" in sys_argv or "--browser safari" in sys_argv:
browser_changes += 1
browser_set = "safari"
@ -1352,11 +1341,6 @@ def pytest_addoption(parser):
browser_text = "ie"
sb_config._browser_shortcut = "ie"
browser_list.append("--ie")
if "--opera" in sys_argv and not browser_set == "opera":
browser_changes += 1
browser_text = "opera"
sb_config._browser_shortcut = "opera"
browser_list.append("--opera")
if "--safari" in sys_argv and not browser_set == "safari":
browser_changes += 1
browser_text = "safari"
@ -1670,8 +1654,6 @@ def pytest_configure(config):
sb_config.browser = "firefox"
elif config.getoption("use_ie"):
sb_config.browser = "ie"
elif config.getoption("use_opera"):
sb_config.browser = "opera"
elif config.getoption("use_safari"):
sb_config.browser = "safari"
else:

View File

@ -201,10 +201,6 @@ def SB(
browser_changes += 1
browser_set = "firefox"
browser_list.append("--browser=firefox")
if "--browser=opera" in sys_argv or "--browser opera" in sys_argv:
browser_changes += 1
browser_set = "opera"
browser_list.append("--browser=opera")
if "--browser=safari" in sys_argv or "--browser safari" in sys_argv:
browser_changes += 1
browser_set = "safari"
@ -238,11 +234,6 @@ def SB(
browser_text = "ie"
sb_config._browser_shortcut = "ie"
browser_list.append("--ie")
if "--opera" in sys_argv and not browser_set == "opera":
browser_changes += 1
browser_text = "opera"
sb_config._browser_shortcut = "opera"
browser_list.append("--opera")
if "--safari" in sys_argv and not browser_set == "safari":
browser_changes += 1
browser_text = "safari"

View File

@ -128,13 +128,6 @@ class SeleniumBrowser(Plugin):
default=False,
help="""Shortcut for --browser=ie""",
)
parser.addoption(
"--opera",
action="store_true",
dest="use_opera",
default=False,
help="""Shortcut for --browser=opera""",
)
parser.addoption(
"--safari",
action="store_true",
@ -958,10 +951,6 @@ class SeleniumBrowser(Plugin):
browser_changes += 1
browser_set = "firefox"
browser_list.append("--browser=firefox")
if "--browser=opera" in sys_argv or "--browser opera" in sys_argv:
browser_changes += 1
browser_set = "opera"
browser_list.append("--browser=opera")
if "--browser=safari" in sys_argv or "--browser safari" in sys_argv:
browser_changes += 1
browser_set = "safari"
@ -995,11 +984,6 @@ class SeleniumBrowser(Plugin):
browser_text = "ie"
sb_config._browser_shortcut = "ie"
browser_list.append("--ie")
if "--opera" in sys_argv and not browser_set == "opera":
browser_changes += 1
browser_text = "opera"
sb_config._browser_shortcut = "opera"
browser_list.append("--opera")
if "--safari" in sys_argv and not browser_set == "safari":
browser_changes += 1
browser_text = "safari"

View File

@ -1,5 +1,5 @@
"""Setup steps for installing SeleniumBase dependencies and plugins.
(Uses selenium 4.x and is compatible with Python 3.6+)"""
(Uses selenium 4.x and is compatible with Python 3.7+)"""
from setuptools import setup, find_packages # noqa: F401
import os
import sys
@ -108,7 +108,6 @@ setup(
"Operating System :: POSIX :: Linux",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",