| Index: chrome/test/functional/autofill.py
|
| ===================================================================
|
| --- chrome/test/functional/autofill.py (revision 261231)
|
| +++ chrome/test/functional/autofill.py (working copy)
|
| @@ -1,223 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2012 The Chromium 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 logging
|
| -import os
|
| -import pickle
|
| -import re
|
| -import simplejson
|
| -
|
| -import pyauto_functional # Must be imported before pyauto
|
| -import pyauto
|
| -import test_utils
|
| -from selenium.webdriver.common.keys import Keys
|
| -from selenium.webdriver.common.action_chains import ActionChains
|
| -from webdriver_pages import settings
|
| -
|
| -
|
| -class AutofillTest(pyauto.PyUITest):
|
| - """Tests that autofill UI works correctly. Also contains a manual test for
|
| - the crowdsourcing server."""
|
| -
|
| - def setUp(self):
|
| - pyauto.PyUITest.setUp(self)
|
| - self._driver = self.NewWebDriver()
|
| -
|
| - def AutofillCrowdsourcing(self):
|
| - """Test able to send POST request of web form to Autofill server.
|
| -
|
| - The Autofill server processes the data offline, so it can take a few days
|
| - for the result to be detectable. Manual verification is required.
|
| - """
|
| - # HTML file needs to be run from a specific http:// url to be able to verify
|
| - # the results a few days later by visiting the same url.
|
| - url = 'http://www.corp.google.com/~dyu/autofill/crowdsourcing-test.html'
|
| - # Autofill server captures 2.5% of the data posted.
|
| - # Looping 1000 times is a safe minimum to exceed the server's threshold or
|
| - # noise.
|
| - for i in range(1000):
|
| - fname = 'David'
|
| - lname = 'Yu'
|
| - email = 'david.yu@gmail.com'
|
| - # Submit form to collect crowdsourcing data for Autofill.
|
| - self.NavigateToURL(url, 0, 0)
|
| - profile = {'fn': fname, 'ln': lname, 'em': email}
|
| - js = ''.join(['document.getElementById("%s").value = "%s";' %
|
| - (key, value) for key, value in profile.iteritems()])
|
| - js += 'document.getElementById("testform").submit();'
|
| - self.ExecuteJavascript(js)
|
| -
|
| - def _SelectOptionXpath(self, value):
|
| - """Returns an xpath query used to select an item from a dropdown list.
|
| - Args:
|
| - value: Option selected for the drop-down list field.
|
| -
|
| - Returns:
|
| - The value of the xpath query.
|
| - """
|
| - return '//option[@value="%s"]' % value
|
| -
|
| - def testPostalCodeAndStateLabelsBasedOnCountry(self):
|
| - """Verify postal code and state labels based on selected country."""
|
| - data_file = os.path.join(self.DataDir(), 'autofill', 'functional',
|
| - 'state_zip_labels.txt')
|
| - test_data = simplejson.loads(open(data_file).read())
|
| -
|
| - page = settings.AutofillEditAddressDialog.FromNavigation(self._driver)
|
| - # Initial check of State and ZIP labels.
|
| - self.assertEqual('State', page.GetStateLabel())
|
| - self.assertEqual('ZIP code', page.GetPostalCodeLabel())
|
| -
|
| - for country_code in test_data:
|
| - page.Fill(country_code=country_code)
|
| -
|
| - # Compare postal code labels.
|
| - actual_postal_label = page.GetPostalCodeLabel()
|
| - self.assertEqual(
|
| - test_data[country_code]['postalCodeLabel'],
|
| - actual_postal_label,
|
| - msg=('Postal code label "%s" does not match Country "%s"' %
|
| - (actual_postal_label, country_code)))
|
| -
|
| - # Compare state labels.
|
| - actual_state_label = page.GetStateLabel()
|
| - self.assertEqual(
|
| - test_data[country_code]['stateLabel'],
|
| - actual_state_label,
|
| - msg=('State label "%s" does not match Country "%s"' %
|
| - (actual_state_label, country_code)))
|
| -
|
| - def testNoDuplicatePhoneNumsInPrefs(self):
|
| - """Test duplicate phone numbers entered in prefs are removed."""
|
| - page = settings.AutofillEditAddressDialog.FromNavigation(self._driver)
|
| - non_duplicates = ['111-1111', '222-2222']
|
| - duplicates = ['111-1111']
|
| - page.Fill(phones=non_duplicates + duplicates)
|
| - self.assertEqual(non_duplicates, page.GetPhones(),
|
| - msg='Duplicate phone number in prefs unexpectedly saved.')
|
| -
|
| - def testDisplayLineItemForEntriesWithNoCCNum(self):
|
| - """Verify Autofill creates a line item for CC entries with no CC number."""
|
| - self.NavigateToURL('chrome://settings-frame/autofillEditCreditCard')
|
| - self._driver.find_element_by_id('name-on-card').send_keys('Jane Doe')
|
| - query_month = self._SelectOptionXpath('12')
|
| - query_year = self._SelectOptionXpath('2014')
|
| - self._driver.find_element_by_id('expiration-month').find_element_by_xpath(
|
| - query_month).click()
|
| - self._driver.find_element_by_id('expiration-year').find_element_by_xpath(
|
| - query_year).click()
|
| - self._driver.find_element_by_id(
|
| - 'autofill-edit-credit-card-apply-button').click()
|
| - # Refresh the page to ensure the UI is up-to-date.
|
| - self._driver.refresh()
|
| - list_entry = self._driver.find_element_by_class_name('autofill-list-item')
|
| - self.assertTrue(list_entry.is_displayed)
|
| - self.assertEqual('Jane Doe', list_entry.text,
|
| - msg='Saved CC line item not same as what was entered.')
|
| -
|
| - def _GetElementList(self, container_elem, fields_to_select):
|
| - """Returns all sub elements of specific characteristics.
|
| -
|
| - Args:
|
| - container_elem: An element that contains other elements.
|
| - fields_to_select: A list of fields to select with strings that
|
| - help create an xpath string, which in turn identifies
|
| - the elements needed.
|
| - For example: ['input', 'button']
|
| - ['div[@id]', 'button[@disabled]']
|
| - ['*[class="example"]']
|
| -
|
| - Returns:
|
| - List of all subelements found in the container element.
|
| - """
|
| - self.assertTrue(fields_to_select, msg='No fields specified for selection.')
|
| - fields_to_select = ['.//' + field for field in fields_to_select]
|
| - xpath_arg = ' | '.join(fields_to_select)
|
| - field_elems = container_elem.find_elements_by_xpath(xpath_arg)
|
| - return field_elems
|
| -
|
| - def _GetElementInfo(self, element):
|
| - """Returns visual comprehensive info about an element.
|
| -
|
| - This function identifies the text of the correspoinding label when tab
|
| - ordering fails.
|
| - This info consists of:
|
| - The labels, buttons, ids, placeholder attribute values, or the element id.
|
| -
|
| - Args:
|
| - element: The target element.
|
| -
|
| - Returns:
|
| - A string that identifies the element in the page.
|
| - """
|
| - element_info = ''
|
| - if element.tag_name == 'button':
|
| - element_info = element.text
|
| - element_info = (element_info or element.get_attribute('id') or
|
| - element.get_attribute('placeholder') or
|
| - element.get_attribute('class') or element.id)
|
| - return '%s: %s' % (element.tag_name, element_info)
|
| -
|
| - def _LoadPageAndGetFieldList(self):
|
| - """Navigate to autofillEditAddress page and finds the elements with focus.
|
| -
|
| - These elements are of input, select, and button types.
|
| -
|
| - Returns:
|
| - A list with all elements that can receive focus.
|
| - """
|
| - url = 'chrome://settings-frame/autofillEditAddress'
|
| - self._driver.get(url)
|
| - container_elem = self._driver.find_element_by_id(
|
| - 'autofill-edit-address-overlay')
|
| - # The container element contains input, select and button fields. Some of
|
| - # the buttons are disabled so they are ignored.
|
| - field_list = self._GetElementList(container_elem,
|
| - ['input', 'select',
|
| - 'button[not(@disabled)]'])
|
| - self.assertTrue(field_list, 'No fields found in "%s".' % url)
|
| - return field_list
|
| -
|
| - def testTabOrderForEditAddress(self):
|
| - """Verify the TAB ordering for Edit Address page is correct."""
|
| - tab_press = ActionChains(self._driver).send_keys(Keys.TAB)
|
| - field_list = self._LoadPageAndGetFieldList()
|
| -
|
| - # Creates a dictionary where a field key returns the value of the next field
|
| - # in the field list. The last field of the field list is mapped to the first
|
| - # field of the field list.
|
| - field_nextfield_dict = dict(
|
| - zip(field_list, field_list[1:] + field_list[:1]))
|
| -
|
| - # Wait until a field of |field_list| has received the focus.
|
| - self.WaitUntil(lambda:
|
| - self._driver.switch_to_active_element().id in
|
| - [f.id for f in field_list])
|
| - # The first field is expected to receive the focus.
|
| - self.assertEqual(self._driver.switch_to_active_element().id,
|
| - field_list[0].id,
|
| - msg='The first field did not receive tab focus.')
|
| - for field in field_list:
|
| - tab_press.perform()
|
| - # Wait until a field of |field_list|, other than the current field, has
|
| - # received the focus.
|
| - self.WaitUntil(lambda:
|
| - self._driver.switch_to_active_element().id != field.id and
|
| - self._driver.switch_to_active_element().id in
|
| - [f.id for f in field_list])
|
| -
|
| - self.assertEqual(self._driver.switch_to_active_element().id,
|
| - field_nextfield_dict[field].id,
|
| - msg=('The TAB ordering is broken. Previous field: "%s"\n'
|
| - 'Field expected to receive focus: "%s"\n'
|
| - 'Field that received focus instead: "%s"')
|
| - % (self._GetElementInfo(field),
|
| - self._GetElementInfo(field_nextfield_dict[field]),
|
| - self._GetElementInfo(
|
| - self._driver.switch_to_active_element())))
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - pyauto_functional.Main()
|
|
|