Add the ability to launch IE tests in headless mode

This commit is contained in:
Michael Mintz 2021-06-04 21:43:00 -04:00
parent 3e35b4ba06
commit 7c2acf53d3
2 changed files with 154 additions and 4 deletions

View File

@ -92,6 +92,8 @@ def main(override=None):
sys.argv = ["seleniumbase", "install", "edgedriver"]
elif override == "geckodriver":
sys.argv = ["seleniumbase", "install", "geckodriver"]
elif override == "iedriver":
sys.argv = ["seleniumbase", "install", "iedriver"]
num_args = len(sys.argv)
if (
@ -108,6 +110,9 @@ def main(override=None):
file_name = None
download_url = None
headless_ie_url = None
headless_ie_exists = False
headless_ie_file_name = None
downloads_folder = DRIVER_DIR
sys_plat = sys.platform
expected_contents = None
@ -336,6 +341,19 @@ def main(override=None):
"https://selenium-release.storage.googleapis.com/"
"%s/%s" % (major_version, file_name)
)
headless_ie_version = "v1.4"
headless_ie_file_name = "headless-selenium-for-win-v1-4.zip"
headless_ie_url = (
"https://github.com/kybu/headless-selenium-for-win/"
"releases/download/"
"%s/%s" % (headless_ie_version, headless_ie_file_name)
)
url_request = requests.get(headless_ie_url)
if url_request.ok:
headless_ie_exists = True
msg = c2 + "HeadlessIEDriver version for download" + cr
p_version = c3 + headless_ie_version + cr
print("\n*** %s = %s" % (msg, p_version))
elif name == "operadriver" or name == "operachromiumdriver":
name = "operadriver"
use_version = DEFAULT_OPERADRIVER_VERSION
@ -411,6 +429,86 @@ def main(override=None):
if not os.path.exists(downloads_folder):
os.mkdir(downloads_folder)
if headless_ie_exists:
headless_ie_file_path = downloads_folder + "/" + headless_ie_file_name
print(
"\nDownloading %s from:\n%s ..."
% (headless_ie_file_name, headless_ie_url)
)
remote_file = requests.get(headless_ie_url)
with open(headless_ie_file_path, "wb") as file:
file.write(remote_file.content)
print("Download Complete!\n")
zip_file_path = headless_ie_file_path
zip_ref = zipfile.ZipFile(zip_file_path, "r")
contents = zip_ref.namelist()
h_ie_fn = headless_ie_file_name.split(".zip")[0]
expected_contents = [
"%s/" % h_ie_fn,
"%s/ruby_example/" % h_ie_fn,
"%s/ruby_example/Gemfile" % h_ie_fn,
"%s/ruby_example/Gemfile.lock" % h_ie_fn,
"%s/ruby_example/ruby_example.rb" % h_ie_fn,
"%s/desktop_utils.exe" % h_ie_fn,
"%s/headless_ie_selenium.exe" % h_ie_fn,
"%s/README.md" % h_ie_fn,
]
if len(contents) > 8:
raise Exception("Unexpected content in HeadlessIEDriver Zip file!")
for content in contents:
if content not in expected_contents:
raise Exception(
"Expected file [%s] missing from [%s]"
% (content, expected_contents)
)
# Zip file is valid. Proceed.
driver_path = None
driver_file = None
filename = None
for f_name in contents:
# Remove existing version if exists
str_name = str(f_name)
new_file = downloads_folder + "/" + str_name
if str_name == "%s/headless_ie_selenium.exe" % h_ie_fn:
driver_file = str_name
driver_path = new_file
filename = "headless_ie_selenium.exe"
if os.path.exists(new_file):
os.remove(new_file)
if not driver_file or not driver_path or not filename:
raise Exception("headless_ie_selenium.exe missing from Zip file!")
print("Extracting %s from %s ..." % (filename, headless_ie_file_name))
zip_ref.extractall(downloads_folder)
zip_ref.close()
os.remove(zip_file_path)
shutil.copyfile(driver_path, "%s/%s" % (downloads_folder, filename))
print("Unzip Complete!\n")
to_remove = [
"%s/%s/ruby_example/Gemfile" % (downloads_folder, h_ie_fn),
"%s/%s/ruby_example/Gemfile.lock" % (downloads_folder, h_ie_fn),
"%s/%s/ruby_example/ruby_example.rb" % (downloads_folder, h_ie_fn),
"%s/%s/desktop_utils.exe" % (downloads_folder, h_ie_fn),
"%s/%s/headless_ie_selenium.exe" % (downloads_folder, h_ie_fn),
"%s/%s/README.md" % (downloads_folder, h_ie_fn),
]
for file_to_remove in to_remove:
if os.path.exists(file_to_remove):
os.remove(file_to_remove)
if os.path.exists("%s/%s/ruby_example/" % (downloads_folder, h_ie_fn)):
# Only works if the directory is empty
os.rmdir("%s/%s/ruby_example/" % (downloads_folder, h_ie_fn))
if os.path.exists("%s/%s/" % (downloads_folder, h_ie_fn)):
# Only works if the directory is empty
os.rmdir("%s/%s/" % (downloads_folder, h_ie_fn))
driver_path = "%s/%s" % (downloads_folder, filename)
print(
"The file [%s] was saved to:\n%s%s%s\n"
% (filename, c3, driver_path, cr)
)
print("Making [%s %s] executable ..." % (driver_file, use_version))
make_executable(driver_path)
print("%s[%s] is now ready for use!%s" % (c1, driver_file, cr))
print("\nDownloading %s from:\n%s ..." % (file_name, download_url))
remote_file = requests.get(download_url)
with open(file_path, "wb") as file:

View File

@ -37,6 +37,7 @@ LOCAL_CHROMEDRIVER = None
LOCAL_GECKODRIVER = None
LOCAL_EDGEDRIVER = None
LOCAL_IEDRIVER = None
LOCAL_HEADLESS_IEDRIVER = None
LOCAL_OPERADRIVER = None
if "darwin" in PLATFORM or "linux" in PLATFORM:
LOCAL_CHROMEDRIVER = DRIVER_DIR + "/chromedriver"
@ -47,6 +48,7 @@ elif "win32" in PLATFORM or "win64" in PLATFORM or "x64" in PLATFORM:
IS_WINDOWS = True
LOCAL_EDGEDRIVER = DRIVER_DIR + "/msedgedriver.exe"
LOCAL_IEDRIVER = DRIVER_DIR + "/IEDriverServer.exe"
LOCAL_HEADLESS_IEDRIVER = DRIVER_DIR + "/headless_ie_selenium.exe"
LOCAL_CHROMEDRIVER = DRIVER_DIR + "/chromedriver.exe"
LOCAL_GECKODRIVER = DRIVER_DIR + "/geckodriver.exe"
LOCAL_OPERADRIVER = DRIVER_DIR + "/operadriver.exe"
@ -73,7 +75,9 @@ def make_driver_executable_if_not(driver_path):
def is_chromedriver_on_path():
paths = os.environ["PATH"].split(os.pathsep)
for path in paths:
if os.path.exists(path + "/" + "chromedriver"):
if (not IS_WINDOWS) and os.path.exists(path + "/chromedriver"):
return True
elif IS_WINDOWS and os.path.exists(path + "/chromedriver.exe"):
return True
return False
@ -85,11 +89,25 @@ def is_edgedriver_on_path():
def is_geckodriver_on_path():
paths = os.environ["PATH"].split(os.pathsep)
for path in paths:
if os.path.exists(path + "/" + "geckodriver"):
if (not IS_WINDOWS) and os.path.exists(path + "/geckodriver"):
return True
elif IS_WINDOWS and os.path.exists(path + "/geckodriver.exe"):
return True
return False
def is_iedriver_on_path():
paths = os.environ["PATH"].split(os.pathsep)
for path in paths:
if os.path.exists(path + "/IEDriverServer.exe"):
return True
return False
def is_headless_iedriver_on_path():
return os.path.exists(LOCAL_HEADLESS_IEDRIVER)
def _add_chrome_proxy_extension(
chrome_options, proxy_string, proxy_user, proxy_pass
):
@ -1049,9 +1067,43 @@ def get_local_driver(
make_driver_executable_if_not(LOCAL_IEDRIVER)
except Exception as e:
logging.debug(
"\nWarning: Could not make iedriver executable: %s" % e
"\nWarning: Could not make IEDriver executable: %s" % e
)
return webdriver.Ie(capabilities=ie_capabilities)
elif not is_iedriver_on_path():
args = " ".join(sys.argv)
if not ("-n" in sys.argv or " -n=" in args or args == "-c"):
# (Not multithreaded)
from seleniumbase.console_scripts import sb_install
sys_args = sys.argv # Save a copy of current sys args
print("\nWarning: IEDriver not found. Installing now:")
sb_install.main(override="iedriver")
sys.argv = sys_args # Put back the original sys args
if LOCAL_HEADLESS_IEDRIVER and os.path.exists(LOCAL_HEADLESS_IEDRIVER):
try:
make_driver_executable_if_not(LOCAL_HEADLESS_IEDRIVER)
except Exception as e:
logging.debug(
"\nWarning: Could not make HeadlessIEDriver executable: %s"
% e
)
elif not is_headless_iedriver_on_path():
args = " ".join(sys.argv)
if not ("-n" in sys.argv or " -n=" in args or args == "-c"):
# (Not multithreaded)
from seleniumbase.console_scripts import sb_install
sys_args = sys.argv # Save a copy of current sys args
print("\nWarning: HeadlessIEDriver not found. Installing now:")
sb_install.main(override="iedriver")
sys.argv = sys_args # Put back the original sys args
if not headless:
return webdriver.Ie(capabilities=ie_capabilities)
else:
return webdriver.Ie(
executable_path=LOCAL_HEADLESS_IEDRIVER,
capabilities=ie_capabilities,
)
elif browser_name == constants.Browser.EDGE:
prefs = {
"download.default_directory": downloads_path,