Commit c9d5ba3c authored by Roman Yurchak's avatar Roman Yurchak

Better logs when PyodideInited() or PackageLoaded() fails on Chrome

parent f35aa2ee
......@@ -4,11 +4,10 @@
// Regexp for validating package name and URI
var package_name_regexp = '[a-z0-9_\-]+'
var package_uri_regexp = new RegExp(
'^https?://.*?(' + package_name_regexp + ').js$', 'i');
var package_uri_regexp =
new RegExp('^https?://.*?(' + package_name_regexp + ').js$', 'i');
var package_name_regexp = new RegExp('^' + package_name_regexp + '$', 'i');
var languagePluginLoader = new Promise((resolve, reject) => {
// This is filled in by the Makefile to be either a local file or the
// deployed location. TODO: This should be done in a less hacky
......@@ -34,7 +33,6 @@ var languagePluginLoader = new Promise((resolve, reject) => {
}
};
let loadPackage = (names) => {
// DFS to find all dependencies of the requested packages
let packages = window.pyodide.packages.dependencies;
......@@ -82,7 +80,7 @@ var languagePluginLoader = new Promise((resolve, reject) => {
pyodide.monitorRunDependencies = (n) => {
if (n === 0) {
for (let package in toLoad) {
loadedPackages[package] = toLoad[package];
loadedPackages[package] = toLoad[package];
}
delete pyodide.monitorRunDependencies;
const packageList = Array.from(Object.keys(toLoad)).join(', ');
......@@ -93,10 +91,10 @@ var languagePluginLoader = new Promise((resolve, reject) => {
for (let package in toLoad) {
let script = document.createElement('script');
let package_uri = toLoad[package];
if (package_uri == 'packages.json') {
script.src = `${baseURL}${package}.js`;
if (package_uri == 'default channel') {
script.src = `${baseURL}${package}.js`;
} else {
script.src = `${package_uri}`;
script.src = `${package_uri}`;
}
script.onerror = (e) => { reject(e); };
document.body.appendChild(script);
......
......@@ -33,9 +33,20 @@ class PackageLoaded:
return bool(inited)
def _display_driver_logs(browser, driver):
if browser == 'chrome':
print('# Selenium browser logs')
print(driver.get_log("browser"))
elif browser == 'firefox':
# browser logs are not available in GeckoDriver
# https://github.com/mozilla/geckodriver/issues/284
print('Cannot access browser logs for Firefox.')
class SeleniumWrapper:
def __init__(self):
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
driver = self.get_driver()
wait = WebDriverWait(driver, timeout=20)
......@@ -44,7 +55,11 @@ class SeleniumWrapper:
raise ValueError(f"{(BUILD_PATH / 'test.html').resolve()} "
f"does not exist!")
driver.get(f'http://127.0.0.1:{PORT}/test.html')
wait.until(PyodideInited())
try:
wait.until(PyodideInited())
except TimeoutException as exc:
_display_driver_logs(self.browser, driver)
raise TimeoutException()
self.wait = wait
self.driver = driver
......@@ -68,11 +83,18 @@ class SeleniumWrapper:
return self.driver.execute_script(catch)
def load_package(self, packages):
from selenium.common.exceptions import TimeoutException
self.run_js(
'window.done = false\n' +
'pyodide.loadPackage({!r})'.format(packages) +
'.then(function() { window.done = true; })')
self.wait.until(PackageLoaded())
try:
self.wait.until(PackageLoaded())
except TimeoutException as exc:
_display_driver_logs(self.browser, self.driver)
print(self.logs)
raise TimeoutException()
@property
def urls(self):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment