| # 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 |