gstreamer/subprojects/gst-examples/webrtc/check/validate/browser.py

88 lines
3.2 KiB
Python

# Copyright (c) 2020, Matthew Waters <matthew@centricular.com>
#
# 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)