Add the ability to launch IE tests in headless mode
This commit is contained in:
parent
3e35b4ba06
commit
7c2acf53d3
|
@ -92,6 +92,8 @@ def main(override=None):
|
||||||
sys.argv = ["seleniumbase", "install", "edgedriver"]
|
sys.argv = ["seleniumbase", "install", "edgedriver"]
|
||||||
elif override == "geckodriver":
|
elif override == "geckodriver":
|
||||||
sys.argv = ["seleniumbase", "install", "geckodriver"]
|
sys.argv = ["seleniumbase", "install", "geckodriver"]
|
||||||
|
elif override == "iedriver":
|
||||||
|
sys.argv = ["seleniumbase", "install", "iedriver"]
|
||||||
|
|
||||||
num_args = len(sys.argv)
|
num_args = len(sys.argv)
|
||||||
if (
|
if (
|
||||||
|
@ -108,6 +110,9 @@ def main(override=None):
|
||||||
|
|
||||||
file_name = None
|
file_name = None
|
||||||
download_url = None
|
download_url = None
|
||||||
|
headless_ie_url = None
|
||||||
|
headless_ie_exists = False
|
||||||
|
headless_ie_file_name = None
|
||||||
downloads_folder = DRIVER_DIR
|
downloads_folder = DRIVER_DIR
|
||||||
sys_plat = sys.platform
|
sys_plat = sys.platform
|
||||||
expected_contents = None
|
expected_contents = None
|
||||||
|
@ -336,6 +341,19 @@ def main(override=None):
|
||||||
"https://selenium-release.storage.googleapis.com/"
|
"https://selenium-release.storage.googleapis.com/"
|
||||||
"%s/%s" % (major_version, file_name)
|
"%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":
|
elif name == "operadriver" or name == "operachromiumdriver":
|
||||||
name = "operadriver"
|
name = "operadriver"
|
||||||
use_version = DEFAULT_OPERADRIVER_VERSION
|
use_version = DEFAULT_OPERADRIVER_VERSION
|
||||||
|
@ -411,6 +429,86 @@ def main(override=None):
|
||||||
if not os.path.exists(downloads_folder):
|
if not os.path.exists(downloads_folder):
|
||||||
os.mkdir(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))
|
print("\nDownloading %s from:\n%s ..." % (file_name, download_url))
|
||||||
remote_file = requests.get(download_url)
|
remote_file = requests.get(download_url)
|
||||||
with open(file_path, "wb") as file:
|
with open(file_path, "wb") as file:
|
||||||
|
|
|
@ -37,6 +37,7 @@ LOCAL_CHROMEDRIVER = None
|
||||||
LOCAL_GECKODRIVER = None
|
LOCAL_GECKODRIVER = None
|
||||||
LOCAL_EDGEDRIVER = None
|
LOCAL_EDGEDRIVER = None
|
||||||
LOCAL_IEDRIVER = None
|
LOCAL_IEDRIVER = None
|
||||||
|
LOCAL_HEADLESS_IEDRIVER = None
|
||||||
LOCAL_OPERADRIVER = None
|
LOCAL_OPERADRIVER = None
|
||||||
if "darwin" in PLATFORM or "linux" in PLATFORM:
|
if "darwin" in PLATFORM or "linux" in PLATFORM:
|
||||||
LOCAL_CHROMEDRIVER = DRIVER_DIR + "/chromedriver"
|
LOCAL_CHROMEDRIVER = DRIVER_DIR + "/chromedriver"
|
||||||
|
@ -47,6 +48,7 @@ elif "win32" in PLATFORM or "win64" in PLATFORM or "x64" in PLATFORM:
|
||||||
IS_WINDOWS = True
|
IS_WINDOWS = True
|
||||||
LOCAL_EDGEDRIVER = DRIVER_DIR + "/msedgedriver.exe"
|
LOCAL_EDGEDRIVER = DRIVER_DIR + "/msedgedriver.exe"
|
||||||
LOCAL_IEDRIVER = DRIVER_DIR + "/IEDriverServer.exe"
|
LOCAL_IEDRIVER = DRIVER_DIR + "/IEDriverServer.exe"
|
||||||
|
LOCAL_HEADLESS_IEDRIVER = DRIVER_DIR + "/headless_ie_selenium.exe"
|
||||||
LOCAL_CHROMEDRIVER = DRIVER_DIR + "/chromedriver.exe"
|
LOCAL_CHROMEDRIVER = DRIVER_DIR + "/chromedriver.exe"
|
||||||
LOCAL_GECKODRIVER = DRIVER_DIR + "/geckodriver.exe"
|
LOCAL_GECKODRIVER = DRIVER_DIR + "/geckodriver.exe"
|
||||||
LOCAL_OPERADRIVER = DRIVER_DIR + "/operadriver.exe"
|
LOCAL_OPERADRIVER = DRIVER_DIR + "/operadriver.exe"
|
||||||
|
@ -73,7 +75,9 @@ def make_driver_executable_if_not(driver_path):
|
||||||
def is_chromedriver_on_path():
|
def is_chromedriver_on_path():
|
||||||
paths = os.environ["PATH"].split(os.pathsep)
|
paths = os.environ["PATH"].split(os.pathsep)
|
||||||
for path in paths:
|
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 True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -85,11 +89,25 @@ def is_edgedriver_on_path():
|
||||||
def is_geckodriver_on_path():
|
def is_geckodriver_on_path():
|
||||||
paths = os.environ["PATH"].split(os.pathsep)
|
paths = os.environ["PATH"].split(os.pathsep)
|
||||||
for path in paths:
|
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 True
|
||||||
return False
|
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(
|
def _add_chrome_proxy_extension(
|
||||||
chrome_options, proxy_string, proxy_user, proxy_pass
|
chrome_options, proxy_string, proxy_user, proxy_pass
|
||||||
):
|
):
|
||||||
|
@ -1049,9 +1067,43 @@ def get_local_driver(
|
||||||
make_driver_executable_if_not(LOCAL_IEDRIVER)
|
make_driver_executable_if_not(LOCAL_IEDRIVER)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.debug(
|
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:
|
elif browser_name == constants.Browser.EDGE:
|
||||||
prefs = {
|
prefs = {
|
||||||
"download.default_directory": downloads_path,
|
"download.default_directory": downloads_path,
|
||||||
|
|
Loading…
Reference in New Issue