Home | History | Annotate | Download | only in cros
      1 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import cgi, os
      6 
      7 from autotest_lib.client.bin import test
      8 from autotest_lib.client.bin import utils
      9 from autotest_lib.client.common_lib.cros import chrome
     10 
     11 _DEFAULT_TIMEOUT = 60  # Seconds a tester has to respond to prompts
     12 
     13 
     14 class semiauto_test(test.test):
     15     """Base class for semiauto tests in ChromeOS.
     16 
     17     All these tests use telemetry and a simple interative webpage that
     18     navigates the user through the test.
     19     """
     20     version = 1
     21 
     22     def login_and_open_interactive_tab(self):
     23         """Log in to machine, open browser, and navigate to dialog template.
     24 
     25         Dialog template is on first tab.  Any other needed tabs can be opened
     26         using the self._browser object.
     27         """
     28         self._browser = chrome.Chrome(init_network_controller=True).browser
     29         self._tab = self._browser.tabs[0]
     30         self._browser.platform.SetHTTPServerDirectories(
     31                 os.path.join(self.bindir, '..', '..', 'cros'))
     32         self._tab.Navigate(self._browser.platform.http_server.UrlOf(
     33                 '/semiauto_shell.html'))
     34 
     35     def close_browser(self):
     36         """Close browser if open."""
     37         if self._browser:
     38             self._browser.Close()
     39 
     40     def set_tab(self, html):
     41         """Replace the body of self._tab with provided html.
     42 
     43         @param html: the HTML that will replace the body of the dialog tab.
     44         """
     45         html_esc = html.replace('"', '\\"')
     46 
     47         # Use JavaScript to set the output.
     48         self._tab.ExecuteJavaScript('window.__ready = 0; '
     49                                     'document.body.innerHTML="%s";' % html_esc)
     50         self._tab.Activate()
     51         self._tab.WaitForDocumentReadyStateToBeInteractiveOrBetter()
     52 
     53     def clear_output(self):
     54         """Replace the body of self._tab with a blank screen.
     55         """
     56         self.set_tab('')
     57 
     58     def set_tab_with_buttons(self, html, buttons=['OK']):
     59         """Replace the body of self._tab with provided html and buttons.
     60 
     61         @param html: the HTML that will replace the body of the dialog tab.
     62         @param buttons: the titles of some number of buttons to add to the
     63                         page. Each button has an integer value, starting from
     64                         0 for the first. Defaults to an 'OK' button.
     65         """
     66         html_total = html+'<br>'
     67         index = 0
     68         for title in buttons:
     69             onclick = 'submit_button(%d)' % index
     70             html_total += ('<input type="button" value="%s" onclick="%s">' % (
     71                            cgi.escape(title), onclick))
     72             index += 1
     73         self.set_tab(html_total)
     74 
     75     def set_tab_with_textbox(self, html, title=''):
     76         """Replace the body of self._tab with provided html and a textbox.
     77 
     78         Adds a textbox and Submit button to the page.  The value returned after
     79         clicking the button is the text that was entered in the textbox.
     80 
     81         @param html: the HTML that will replace the body of the dialog tab.
     82         @param title: the title put next to the textbox.
     83         """
     84         textbox = '%s<input type="text" id="textinput"/>' % title
     85         button = '<input type="button" value="SUBMIT" onclick="get_text()"/>'
     86         html_total = '%s<br>%s<br>%s' % (html, textbox, button)
     87         self.set_tab(html_total)
     88 
     89     def wait_for_tab_result(self, timeout=_DEFAULT_TIMEOUT):
     90         """Wait for interactive tab to be ready and get return value.
     91 
     92         @param timeout: Maximum number of seconds to wait for result.
     93 
     94         @return: value of window.__result.
     95         """
     96         complete = lambda: self._tab.EvaluateJavaScript('window.__ready') == 1
     97         utils.poll_for_condition(condition=complete, timeout=timeout,
     98                                  desc='User response')
     99 
    100         result = self._tab.EvaluateJavaScript('window.__result')
    101         self._tab.ExecuteJavaScript('window.__ready = 0; '
    102                                     'window.__result = null;')
    103         return result
    104