104 lines
4.0 KiB
Python
104 lines
4.0 KiB
Python
# 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
|