import time import os from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.firefox import GeckoDriverManager from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.firefox.service import Service as FirefoxService from selenium.webdriver.common.by import By from selenium import webdriver from bs4 import BeautifulSoup from prettytable import from_html_one def install_drivers(chrome_version, gecko_version): print("Downloading drivers...") # Download Chrome driver chrome_driver_manager = ChromeDriverManager(version=chrome_version) chrome_driver_manager.install() # Download Firefox driver firefox_driver_manager = GeckoDriverManager(version=gecko_version) firefox_driver_manager.install() with open("chrome_version", "w") as f: f.write(chrome_driver_manager.driver.get_version()) with open("firefox_version", "w") as f: f.write(firefox_driver_manager.driver.get_version()) def authenticated_url(openvidu_url, openvidu_secret): separator = "://" basic_auth_url_str = "OPENVIDUAPP:" + openvidu_secret + "@" split_url = openvidu_url.split(separator) return split_url[0] + separator + basic_auth_url_str + split_url[1] def runBrowser(browser, turn=False): driver=None if browser == "chrome": driver = runChrome() else: driver = runFirefox(turn) driver.maximize_window() driver.implicitly_wait(10) return driver def runChrome(): # Get Chrome driver version from environment variable chrome_version = os.environ.get("CHROME_VERSION") # Get Chrome driver version from file if not found in environment variable # Read it only if file exist (it may not exist if running in a container) if chrome_version is None and os.path.isfile("chrome_version"): with open("chrome_version", "r") as f: chrome_version = f.read() print("Chrome version: ", chrome_version) print("Running chrome...") options = webdriver.ChromeOptions() options.add_argument("--use-fake-ui-for-media-stream") options.add_argument("--disable-infobars") options.add_argument("--ignore-certificate-errors") options.add_argument("--start-maximized") options.add_argument("--use-fake-device-for-media-stream") options.add_argument("--no-sandbox") return webdriver.Chrome( service=ChromeService(ChromeDriverManager(version=chrome_version).install()), options = options) def runFirefox(turn=False): # Get Gecko driver version from environment variable gecko_version = os.environ.get("GECKO_VERSION") # Get Gecko driver version from file if not found in environment variable # Read it only if file exist (it may not exist if running in a container) if gecko_version is None and os.path.isfile("firefox_version"): with open("firefox_version", "r") as f: gecko_version = f.read() print("Gecko version: ", gecko_version) print("Running firefox with Turn: ", turn) options = webdriver.FirefoxOptions() options.set_preference('media.navigator.permission.disabled', True) options.set_preference('media.navigator.streams.fake', True) options.set_preference('media.peerconnection.enabled', True) options.set_preference('media.peerconnection.ice.obfuscate_host_addresses', False) options.set_preference('media.peerconnection.identity.enabled', True) options.set_preference('media.peerconnection.mtransport_process', True) options.set_preference('media.peerconnection.ice.no_host', False) options.set_preference('network.process.enabled', True) options.set_preference('media.peerconnection.ice.relay_only', turn) options.set_preference('media.peerconnection.turn.disable', not turn) return webdriver.Firefox( service=FirefoxService(GeckoDriverManager(version=gecko_version).install()), options = options) def print_candidates(driver): try: # New tab driver.execute_script("window.open('');") # Switch to the new window driver.switch_to.window(driver.window_handles[1]) # Open about:webrtc driver.get('about:webrtc') peer_conn_elems = driver.find_elements(By.CLASS_NAME, "peer-connection") for peer_conn in peer_conn_elems: show_details_elems = peer_conn.find_elements(By.XPATH, "//*[contains(text(), 'show details')]") for show_details in show_details_elems: show_details.click() print("Waiting for candidates to be checked...") # Get ice stats time.sleep(15) # about:webrtc page refreshes each second, so we need to # safe the entire HTML in a variable to have a Snapshot of the situation about_webrtc_html = '' + driver.find_element(By.TAG_NAME, 'html').get_attribute('innerHTML') + '' # Search the tables using a parser and print all candidates soup = BeautifulSoup(about_webrtc_html, 'html.parser') for caption in soup.findAll('caption', {'data-l10n-id' : 'about-webrtc-trickle-caption-msg'}): print(from_html_one(str(caption.parent))) # Close about:webrtc driver.close() driver.switch_to.window(driver.window_handles[0]) driver.close() except: print('[Warn] Some candidates may not appear in test result') driver.switch_to.window(driver.window_handles[0]) driver.close()