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 @@ ...@@ -4,11 +4,10 @@
// Regexp for validating package name and URI // Regexp for validating package name and URI
var package_name_regexp = '[a-z0-9_\-]+' var package_name_regexp = '[a-z0-9_\-]+'
var package_uri_regexp = new RegExp( var package_uri_regexp =
'^https?://.*?(' + package_name_regexp + ').js$', 'i'); new RegExp('^https?://.*?(' + package_name_regexp + ').js$', 'i');
var package_name_regexp = new RegExp('^' + package_name_regexp + '$', 'i'); var package_name_regexp = new RegExp('^' + package_name_regexp + '$', 'i');
var languagePluginLoader = new Promise((resolve, reject) => { var languagePluginLoader = new Promise((resolve, reject) => {
// This is filled in by the Makefile to be either a local file or the // 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 // deployed location. TODO: This should be done in a less hacky
...@@ -34,7 +33,6 @@ var languagePluginLoader = new Promise((resolve, reject) => { ...@@ -34,7 +33,6 @@ var languagePluginLoader = new Promise((resolve, reject) => {
} }
}; };
let loadPackage = (names) => { let loadPackage = (names) => {
// DFS to find all dependencies of the requested packages // DFS to find all dependencies of the requested packages
let packages = window.pyodide.packages.dependencies; let packages = window.pyodide.packages.dependencies;
...@@ -93,7 +91,7 @@ var languagePluginLoader = new Promise((resolve, reject) => { ...@@ -93,7 +91,7 @@ var languagePluginLoader = new Promise((resolve, reject) => {
for (let package in toLoad) { for (let package in toLoad) {
let script = document.createElement('script'); let script = document.createElement('script');
let package_uri = toLoad[package]; let package_uri = toLoad[package];
if (package_uri == 'packages.json') { if (package_uri == 'default channel') {
script.src = `${baseURL}${package}.js`; script.src = `${baseURL}${package}.js`;
} else { } else {
script.src = `${package_uri}`; script.src = `${package_uri}`;
......
...@@ -33,9 +33,20 @@ class PackageLoaded: ...@@ -33,9 +33,20 @@ class PackageLoaded:
return bool(inited) 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: class SeleniumWrapper:
def __init__(self): def __init__(self):
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
driver = self.get_driver() driver = self.get_driver()
wait = WebDriverWait(driver, timeout=20) wait = WebDriverWait(driver, timeout=20)
...@@ -44,7 +55,11 @@ class SeleniumWrapper: ...@@ -44,7 +55,11 @@ class SeleniumWrapper:
raise ValueError(f"{(BUILD_PATH / 'test.html').resolve()} " raise ValueError(f"{(BUILD_PATH / 'test.html').resolve()} "
f"does not exist!") f"does not exist!")
driver.get(f'http://127.0.0.1:{PORT}/test.html') driver.get(f'http://127.0.0.1:{PORT}/test.html')
try:
wait.until(PyodideInited()) wait.until(PyodideInited())
except TimeoutException as exc:
_display_driver_logs(self.browser, driver)
raise TimeoutException()
self.wait = wait self.wait = wait
self.driver = driver self.driver = driver
...@@ -68,11 +83,18 @@ class SeleniumWrapper: ...@@ -68,11 +83,18 @@ class SeleniumWrapper:
return self.driver.execute_script(catch) return self.driver.execute_script(catch)
def load_package(self, packages): def load_package(self, packages):
from selenium.common.exceptions import TimeoutException
self.run_js( self.run_js(
'window.done = false\n' + 'window.done = false\n' +
'pyodide.loadPackage({!r})'.format(packages) + 'pyodide.loadPackage({!r})'.format(packages) +
'.then(function() { window.done = true; })') '.then(function() { window.done = true; })')
try:
self.wait.until(PackageLoaded()) self.wait.until(PackageLoaded())
except TimeoutException as exc:
_display_driver_logs(self.browser, self.driver)
print(self.logs)
raise TimeoutException()
@property @property
def urls(self): 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