# Copyright (c) 2020, Matthew Waters # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301, USA. import logging from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.firefox.firefox_profile import FirefoxProfile from selenium.webdriver.chrome.options import Options as COptions l = logging.getLogger(__name__) def create_firefox_driver(): capabilities = webdriver.DesiredCapabilities().FIREFOX.copy() capabilities['acceptSslCerts'] = True profile = FirefoxProfile() profile.set_preference ('media.navigator.streams.fake', True) profile.set_preference ('media.navigator.permission.disabled', True) return webdriver.Firefox(firefox_profile=profile, capabilities=capabilities) def create_chrome_driver(): capabilities = webdriver.DesiredCapabilities().CHROME.copy() capabilities['acceptSslCerts'] = True copts = COptions() copts.add_argument('--allow-file-access-from-files') copts.add_argument('--use-fake-ui-for-media-stream') copts.add_argument('--use-fake-device-for-media-stream') copts.add_argument('--enable-blink-features=RTCUnifiedPlanByDefault') # XXX: until libnice can deal with mdns candidates local_state = {"enabled_labs_experiments" : ["enable-webrtc-hide-local-ips-with-mdns@2"] } copts.add_experimental_option("localState", {"browser" : local_state}) return webdriver.Chrome(options=copts, desired_capabilities=capabilities) def create_driver(name): if name == 'firefox': return create_firefox_driver() elif name == 'chrome': return create_chrome_driver() else: raise ValueError("Unknown browser name \'" + name + "\'") def valid_int(n): if isinstance(n, int): return True if isinstance(n, str): try: num = int(n) return True except: return False return False class Browser(object): """ A browser as connected through selenium. """ def __init__(self, driver): l.info('Using driver \'' + driver.name + '\' with capabilities ' + str(driver.capabilities)) self.driver = driver def open(self, html_source): self.driver.get(html_source) def get_peer_id(self): peer_id = WebDriverWait(self.driver, 5).until( lambda x: x.find_element_by_id('peer-id'), message='Peer-id element was never seen' ) WebDriverWait (self.driver, 5).until( lambda x: valid_int(peer_id.text), message='Peer-id never became a number' ) return int(peer_id.text)