# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import cgi, os from autotest_lib.client.bin import test from autotest_lib.client.bin import utils from autotest_lib.client.common_lib.cros import chrome _DEFAULT_TIMEOUT = 60 # Seconds a tester has to respond to prompts class semiauto_test(test.test): """Base class for semiauto tests in ChromeOS. All these tests use telemetry and a simple interative webpage that navigates the user through the test. """ version = 1 def login_and_open_interactive_tab(self): """Log in to machine, open browser, and navigate to dialog template. Dialog template is on first tab. Any other needed tabs can be opened using the self._browser object. """ self._browser = chrome.Chrome(init_network_controller=True).browser self._tab = self._browser.tabs[0] self._browser.platform.SetHTTPServerDirectories( os.path.join(self.bindir, '..', '..', 'cros')) self._tab.Navigate(self._browser.platform.http_server.UrlOf( '/semiauto_shell.html')) def close_browser(self): """Close browser if open.""" if self._browser: self._browser.Close() def set_tab(self, html): """Replace the body of self._tab with provided html. @param html: the HTML that will replace the body of the dialog tab. """ html_esc = html.replace('"', '\\"') # Use JavaScript to set the output. self._tab.ExecuteJavaScript('window.__ready = 0; ' 'document.body.innerHTML="%s";' % html_esc) self._tab.Activate() self._tab.WaitForDocumentReadyStateToBeInteractiveOrBetter() def clear_output(self): """Replace the body of self._tab with a blank screen. """ self.set_tab('') def set_tab_with_buttons(self, html, buttons=['OK']): """Replace the body of self._tab with provided html and buttons. @param html: the HTML that will replace the body of the dialog tab. @param buttons: the titles of some number of buttons to add to the page. Each button has an integer value, starting from 0 for the first. Defaults to an 'OK' button. """ html_total = html+'<br>' index = 0 for title in buttons: onclick = 'submit_button(%d)' % index html_total += ('<input type="button" value="%s" onclick="%s">' % ( cgi.escape(title), onclick)) index += 1 self.set_tab(html_total) def set_tab_with_textbox(self, html, title=''): """Replace the body of self._tab with provided html and a textbox. Adds a textbox and Submit button to the page. The value returned after clicking the button is the text that was entered in the textbox. @param html: the HTML that will replace the body of the dialog tab. @param title: the title put next to the textbox. """ textbox = '%s<input type="text" id="textinput"/>' % title button = '<input type="button" value="SUBMIT" onclick="get_text()"/>' html_total = '%s<br>%s<br>%s' % (html, textbox, button) self.set_tab(html_total) def wait_for_tab_result(self, timeout=_DEFAULT_TIMEOUT): """Wait for interactive tab to be ready and get return value. @param timeout: Maximum number of seconds to wait for result. @return: value of window.__result. """ complete = lambda: self._tab.EvaluateJavaScript('window.__ready') == 1 utils.poll_for_condition(condition=complete, timeout=timeout, desc='User response') result = self._tab.EvaluateJavaScript('window.__result') self._tab.ExecuteJavaScript('window.__ready = 0; ' 'window.__result = null;') return result