diff --git a/brozzler/browser.py b/brozzler/browser.py index 35caa27..288d64b 100644 --- a/brozzler/browser.py +++ b/brozzler/browser.py @@ -202,6 +202,17 @@ class WebsockReceiverThread(threading.Thread): if self.on_response: self.on_response(message) + def _javascript_dialog_opening(self, message): + self.logger.info('javascript dialog opened: %s', message) + if message['params']['type'] == 'alert': + accept = True + else: + accept = False + self.websock.send( + json.dumps(dict( + id=0, method='Page.handleJavaScriptDialog', + params={'accept': accept}))) + def _handle_message(self, websock, json_message): message = json.loads(json_message) if 'method' in message: @@ -223,6 +234,8 @@ class WebsockReceiverThread(threading.Thread): '%s console.%s %s', self.websock.url, message['params']['message']['level'], message['params']['message']['text']) + elif message['method'] == 'Page.javascriptDialogOpening': + self._javascript_dialog_opening(message) # else: # self.logger.debug("%s %s", message["method"], json_message) elif 'result' in message: diff --git a/setup.py b/setup.py index 4601475..f3cf5fb 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ def find_package_data(package): setuptools.setup( name='brozzler', - version='1.1b9.dev165', + version='1.1b9.dev167', description='Distributed web crawling with browsers', url='https://github.com/internetarchive/brozzler', author='Noah Levitt', diff --git a/tests/htdocs/site4/alert.html b/tests/htdocs/site4/alert.html new file mode 100644 index 0000000..5770aec --- /dev/null +++ b/tests/htdocs/site4/alert.html @@ -0,0 +1,13 @@ + +
+this is a page that pops up an alert
+ + + diff --git a/tests/htdocs/site4/confirm.html b/tests/htdocs/site4/confirm.html new file mode 100644 index 0000000..e4e3339 --- /dev/null +++ b/tests/htdocs/site4/confirm.html @@ -0,0 +1,13 @@ + + +this is a page that pops up a confirm modal dialog
+ + + diff --git a/tests/htdocs/site4/print.html b/tests/htdocs/site4/print.html new file mode 100644 index 0000000..031704f --- /dev/null +++ b/tests/htdocs/site4/print.html @@ -0,0 +1,13 @@ + + +this is a page that pops up a print dialog
+ + + diff --git a/tests/htdocs/site4/prompt.html b/tests/htdocs/site4/prompt.html new file mode 100644 index 0000000..0f61aab --- /dev/null +++ b/tests/htdocs/site4/prompt.html @@ -0,0 +1,13 @@ + + +this is a page that pops up a prompt
+ + + diff --git a/tests/test_brozzling.py b/tests/test_brozzling.py index 563f106..5d66db9 100644 --- a/tests/test_brozzling.py +++ b/tests/test_brozzling.py @@ -114,7 +114,6 @@ def test_on_response(httpd): url = 'http://localhost:%s/site3/page.html' % httpd.server_port with brozzler.Browser(chrome_exe=chrome_exe) as browser: browser.browse_page(url, on_response=on_response) - browser.browse_page(url) assert response_urls[0] == 'http://localhost:%s/site3/page.html' % httpd.server_port assert response_urls[1] == 'http://localhost:%s/site3/brozzler.svg' % httpd.server_port assert response_urls[2] == 'http://localhost:%s/favicon.ico' % httpd.server_port @@ -126,3 +125,20 @@ def test_420(httpd): with pytest.raises(brozzler.ReachedLimit) as excinfo: browser.browse_page(url) assert excinfo.value.warcprox_meta == WARCPROX_META_420 + +def test_js_dialogs(httpd): + chrome_exe = brozzler.suggest_default_chrome_exe() + url = 'http://localhost:%s/site4/alert.html' % httpd.server_port + with brozzler.Browser(chrome_exe=chrome_exe) as browser: + # before commit d2ed6b97a24 these would hang and eventually raise + # brozzler.browser.BrowsingTimeout, which would cause this test to fail + browser.browse_page( + 'http://localhost:%s/site4/alert.html' % httpd.server_port) + browser.browse_page( + 'http://localhost:%s/site4/confirm.html' % httpd.server_port) + browser.browse_page( + 'http://localhost:%s/site4/prompt.html' % httpd.server_port) + # XXX print dialog unresolved + # browser.browse_page( + # 'http://localhost:%s/site4/print.html' % httpd.server_port) +