Index: chrome/test/functional/autofill.py |
=================================================================== |
--- chrome/test/functional/autofill.py (revision 152427) |
+++ chrome/test/functional/autofill.py (working copy) |
@@ -9,8 +9,6 @@ |
import re |
import simplejson |
-import autofill_dataset_converter |
-import autofill_dataset_generator |
import pyauto_functional # Must be imported before pyauto |
import pyauto |
import test_utils |
@@ -20,597 +18,13 @@ |
class AutofillTest(pyauto.PyUITest): |
- """Tests that autofill works correctly""" |
+ """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 Debug(self): |
- """Test method for experimentation. |
- |
- This method will not run automatically. |
- """ |
- while True: |
- raw_input('Hit <enter> to dump info.. ') |
- self.pprint(self.GetAutofillProfile()) |
- |
- def testFillProfile(self): |
- """Test filling profiles and overwriting with new profiles.""" |
- profiles = [{'NAME_FIRST': ['Bob',], |
- 'NAME_LAST': ['Smith',], 'ADDRESS_HOME_ZIP': ['94043',],}, |
- {'EMAIL_ADDRESS': ['sue@example.com',], |
- 'COMPANY_NAME': ['Company X',],}] |
- credit_cards = [{'CREDIT_CARD_NUMBER': '6011111111111117', |
- 'CREDIT_CARD_EXP_MONTH': '12', |
- 'CREDIT_CARD_EXP_4_DIGIT_YEAR': '2011'}, |
- {'CREDIT_CARD_NAME': 'Bob C. Smith'}] |
- |
- self.FillAutofillProfile(profiles=profiles, credit_cards=credit_cards) |
- profile = self.GetAutofillProfile() |
- self.assertEqual(profiles, profile['profiles']) |
- self.assertEqual(credit_cards, profile['credit_cards']) |
- |
- profiles = [ {'NAME_FIRST': ['Larry']}] |
- self.FillAutofillProfile(profiles=profiles) |
- profile = self.GetAutofillProfile() |
- self.assertEqual(profiles, profile['profiles']) |
- self.assertEqual(credit_cards, profile['credit_cards']) |
- |
- def testFillProfileMultiValue(self): |
- """Test filling a profile with multi-value data.""" |
- profile_expected = [{'NAME_FIRST': ['Bob', 'Joe'], |
- 'NAME_LAST': ['Smith', 'Jones'], |
- 'ADDRESS_HOME_ZIP': ['94043',],},] |
- |
- self.FillAutofillProfile(profiles=profile_expected) |
- profile_actual = self.GetAutofillProfile() |
- self.assertEqual(profile_expected, profile_actual['profiles']) |
- |
- def testFillProfileCrazyCharacters(self): |
- """Test filling profiles with unicode strings and crazy characters.""" |
- # Adding autofill profiles. |
- file_path = os.path.join(self.DataDir(), 'autofill', 'functional', |
- 'crazy_autofill.txt') |
- profiles = self.EvalDataFrom(file_path) |
- self.FillAutofillProfile(profiles=profiles) |
- self.assertEqual(profiles, self.GetAutofillProfile()['profiles'], |
- msg='Autofill profile data does not match.') |
- |
- # Adding credit cards. |
- file_path = os.path.join(self.DataDir(), 'autofill', 'functional', |
- 'crazy_creditcards.txt') |
- test_data = self.EvalDataFrom(file_path) |
- credit_cards_input = test_data['input'] |
- self.FillAutofillProfile(credit_cards=credit_cards_input) |
- |
- self.assertEqual(test_data['expected'], |
- self.GetAutofillProfile()['credit_cards'], |
- msg='Autofill credit card data does not match.') |
- |
- def testGetProfilesEmpty(self): |
- """Test getting profiles when none have been filled.""" |
- profile = self.GetAutofillProfile() |
- self.assertEqual([], profile['profiles']) |
- self.assertEqual([], profile['credit_cards']) |
- |
- def testAutofillInvalid(self): |
- """Test filling in invalid values for profiles are saved as-is. |
- |
- Phone information entered into the prefs UI is not validated or rejected |
- except for duplicates. |
- """ |
- # First try profiles with invalid ZIP input. |
- without_invalid = {'NAME_FIRST': ['Will',], |
- 'ADDRESS_HOME_CITY': ['Sunnyvale',], |
- 'ADDRESS_HOME_STATE': ['CA',], |
- 'ADDRESS_HOME_ZIP': ['my_zip',], |
- 'ADDRESS_HOME_COUNTRY': ['United States',]} |
- # Add invalid data for phone field. |
- with_invalid = without_invalid.copy() |
- with_invalid['PHONE_HOME_WHOLE_NUMBER'] = ['Invalid_Phone_Number',] |
- self.FillAutofillProfile(profiles=[with_invalid]) |
- self.assertNotEqual( |
- [without_invalid], self.GetAutofillProfile()['profiles'], |
- msg='Phone data entered into prefs UI is validated.') |
- |
- def testAutofillPrefsStringSavedAsIs(self): |
- """Test invalid credit card numbers typed in prefs should be saved as-is.""" |
- credit_card = {'CREDIT_CARD_NUMBER': 'Not_0123-5Checked'} |
- self.FillAutofillProfile(credit_cards=[credit_card]) |
- self.assertEqual([credit_card], |
- self.GetAutofillProfile()['credit_cards'], |
- msg='Credit card number in prefs not saved as-is.') |
- |
- def _WaitForWebpageFormReadyToFillIn(self, form_profile, tab_index, windex): |
- """Waits until an autofill form on a webpage is ready to be filled in. |
- |
- A call to NavigateToURL() may return before all form elements on the page |
- are ready to be accessed. This function waits until they are ready to be |
- filled in. |
- |
- Args: |
- form_profile: A dictionary representing an autofill profile in which the |
- keys are strings corresponding to webpage element IDs. |
- tab_index: The index of the tab containing the webpage form to check. |
- windex: The index of the window containing the webpage form to check. |
- """ |
- field_check_code = ''.join( |
- ['if (!document.getElementById("%s")) ready = "false";' % |
- key for key in form_profile.keys()]) |
- js = """ |
- var ready = 'true'; |
- if (!document.getElementById("testform")) |
- ready = 'false'; |
- %s |
- window.domAutomationController.send(ready); |
- """ % field_check_code |
- self.assertTrue( |
- self.WaitUntil(lambda: self.ExecuteJavascript(js, tab_index, windex), |
- expect_retval='true'), |
- msg='Timeout waiting for webpage form to be ready to be filled in.') |
- |
- def _FillFormAndSubmit(self, datalist, filename, tab_index=0, windex=0): |
- """Navigate to the form, input values into the fields, and submit the form. |
- |
- If multiple profile dictionaries are specified as input, this function will |
- repeatedly navigate to the form, fill it out, and submit it, once for each |
- specified profile dictionary. |
- |
- Args: |
- datalist: A list of dictionaries, where each dictionary represents the |
- key/value pairs for profiles or credit card values. |
- filename: HTML form website file. The file is the basic file name and not |
- the path to the file. File is assumed to be located in |
- autofill/functional directory of the data folder. |
- tab_index: Integer index of the tab to work on; defaults to 0 (first tab). |
- windex: Integer index of the browser window to work on; defaults to 0 |
- (first window). |
- """ |
- url = self.GetHttpURLForDataPath('autofill', 'functional', filename) |
- for profile in datalist: |
- self.NavigateToURL(url) |
- self._WaitForWebpageFormReadyToFillIn(profile, tab_index, windex) |
- # Fill in and submit the form. |
- js = ''.join(['document.getElementById("%s").value = "%s";' % |
- (key, value) for key, value in profile.iteritems()]) |
- js += 'document.getElementById("testform").submit();' |
- self.SubmitAutofillForm(js, tab_index=tab_index, windex=windex) |
- |
- def _LuhnCreditCardNumberValidator(self, number): |
- """Validates whether a number is valid or invalid using the Luhn test. |
- |
- Validation example: |
- 1. Example number: 49927398716 |
- 2. Reverse the digits: 61789372994 |
- 3. Sum the digits in the odd-numbered position for s1: |
- 6 + 7 + 9 + 7 + 9 + 4 = 42 |
- 4. Take the digits in the even-numbered position: 1, 8, 3, 2, 9 |
- 4.1. Two times each digit in the even-numbered position: 2, 16, 6, 4, 18 |
- 4.2. For each resulting value that is now 2 digits, add the digits |
- together: 2, 7, 6, 4, 9 |
- (0 + 2 = 2, 1 + 6 = 7, 0 + 6 = 6, 0 + 4 = 4, 1 + 8 = 9) |
- 4.3. Sum together the digits for s2: 2 + 7 + 6 + 4 + 9 = 28 |
- 5. Sum together s1 + s2 and if the sum ends in zero, the number passes the |
- Luhn test: 42 + 28 = 70 which is a valid credit card number. |
- |
- Args: |
- number: the credit card number being validated, as a string. |
- |
- Returns: |
- boolean whether the credit card number is valid or not. |
- """ |
- # Filters out non-digit characters. |
- number = re.sub('[^0-9]', '', number) |
- reverse = [int(ch) for ch in str(number)][::-1] |
- # The divmod of the function splits a number into two digits, ready for |
- # summing. |
- return ((sum(reverse[0::2]) + sum(sum(divmod(d*2, 10)) |
- for d in reverse[1::2])) % 10 == 0) |
- |
- def testInvalidCreditCardNumberIsNotAggregated(self): |
- """Test credit card info with an invalid number is not aggregated. |
- |
- When filling out a form with an invalid credit card number (one that |
- does not pass the Luhn test) the credit card info should not be saved into |
- Autofill preferences. |
- """ |
- invalid_cc_info = {'CREDIT_CARD_NAME': 'Bob Smith', |
- 'CREDIT_CARD_NUMBER': '4408 0412 3456 7890', |
- 'CREDIT_CARD_EXP_MONTH': '12', |
- 'CREDIT_CARD_EXP_4_DIGIT_YEAR': '2014'} |
- |
- cc_number = invalid_cc_info['CREDIT_CARD_NUMBER'] |
- self._FillFormAndSubmit([invalid_cc_info], 'autofill_creditcard_form.html', |
- tab_index=0, windex=0) |
- self.assertFalse(self._LuhnCreditCardNumberValidator(cc_number), |
- msg='This test requires an invalid credit card number.') |
- cc_infobar = self.GetBrowserInfo()['windows'][0]['tabs'][0]['infobars'] |
- self.assertFalse( |
- cc_infobar, msg='Save credit card infobar offered to save CC info.') |
- |
- def testWhitespacesAndSeparatorCharsStrippedForValidCCNums(self): |
- """Test whitespaces and separator chars are stripped for valid CC numbers. |
- |
- The credit card numbers used in this test pass the Luhn test. |
- For reference: http://www.merriampark.com/anatomycc.htm |
- """ |
- credit_card_info = [{'CREDIT_CARD_NAME': 'Bob Smith', |
- 'CREDIT_CARD_NUMBER': '4408 0412 3456 7893', |
- 'CREDIT_CARD_EXP_MONTH': '12', |
- 'CREDIT_CARD_EXP_4_DIGIT_YEAR': '2014'}, |
- {'CREDIT_CARD_NAME': 'Jane Doe', |
- 'CREDIT_CARD_NUMBER': '4417-1234-5678-9113', |
- 'CREDIT_CARD_EXP_MONTH': '10', |
- 'CREDIT_CARD_EXP_4_DIGIT_YEAR': '2013'}] |
- |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'autofill_creditcard_form.html') |
- for cc_info in credit_card_info: |
- self.assertTrue( |
- self._LuhnCreditCardNumberValidator(cc_info['CREDIT_CARD_NUMBER']), |
- msg='This test requires a valid credit card number.') |
- self.NavigateToURL(url) |
- self._WaitForWebpageFormReadyToFillIn(cc_info, 0, 0) |
- # Fill in and submit the form. |
- js = ''.join(['document.getElementById("%s").value = "%s";' % |
- (key, value) for key, value in cc_info.iteritems()]) |
- js += 'document.getElementById("testform").submit();' |
- self.SubmitAutofillForm(js, tab_index=0, windex=0) |
- |
- # Verify the filled-in credit card number against the aggregated number. |
- aggregated_cc_1 = ( |
- self.GetAutofillProfile()['credit_cards'][0]['CREDIT_CARD_NUMBER']) |
- aggregated_cc_2 = ( |
- self.GetAutofillProfile()['credit_cards'][1]['CREDIT_CARD_NUMBER']) |
- self.assertFalse((' ' in aggregated_cc_1 or ' ' in aggregated_cc_2 or |
- '-' in aggregated_cc_1 or '-' in aggregated_cc_2), |
- msg='Whitespaces or separator chars not stripped.') |
- |
- def testAggregatesMinValidProfile(self): |
- """Test that Autofill aggregates a minimum valid profile. |
- |
- The minimum required address fields must be specified: First Name, |
- Last Name, Address Line 1, City, Zip Code, and State. |
- """ |
- profile = {'NAME_FIRST': 'Bob', |
- 'NAME_LAST': 'Smith', |
- 'ADDRESS_HOME_LINE1': '1234 H St.', |
- 'ADDRESS_HOME_CITY': 'Mountain View', |
- 'ADDRESS_HOME_STATE': 'CA', |
- 'ADDRESS_HOME_ZIP': '95110'} |
- self._FillFormAndSubmit( |
- [profile], 'duplicate_profiles_test.html', tab_index=0, windex=0) |
- self.assertTrue(self.GetAutofillProfile()['profiles'], |
- msg='Profile with minimum address values not aggregated.') |
- |
- def testProfilesNotAggregatedWithNoAddress(self): |
- """Test Autofill does not aggregate profiles with no address info. |
- |
- The minimum required address fields must be specified: First Name, |
- Last Name, Address Line 1, City, Zip Code, and State. |
- """ |
- profile = {'NAME_FIRST': 'Bob', |
- 'NAME_LAST': 'Smith', |
- 'EMAIL_ADDRESS': 'bsmith@example.com', |
- 'COMPANY_NAME': 'Company X', |
- 'ADDRESS_HOME_CITY': 'Mountain View', |
- 'PHONE_HOME_WHOLE_NUMBER': '650-555-4567',} |
- self._FillFormAndSubmit( |
- [profile], 'duplicate_profiles_test.html', tab_index=0, windex=0) |
- self.assertFalse(self.GetAutofillProfile()['profiles'], |
- msg='Profile with no address info was aggregated.') |
- |
- def testProfilesNotAggregatedWithInvalidEmail(self): |
- """Test Autofill does not aggregate profiles with an invalid email.""" |
- profile = {'NAME_FIRST': 'Bob', |
- 'NAME_LAST': 'Smith', |
- 'EMAIL_ADDRESS': 'garbage', |
- 'ADDRESS_HOME_LINE1': '1234 H St.', |
- 'ADDRESS_HOME_CITY': 'San Jose', |
- 'ADDRESS_HOME_STATE': 'CA', |
- 'ADDRESS_HOME_ZIP': '95110', |
- 'COMPANY_NAME': 'Company X', |
- 'PHONE_HOME_WHOLE_NUMBER': '408-871-4567',} |
- self._FillFormAndSubmit( |
- [profile], 'duplicate_profiles_test.html', tab_index=0, windex=0) |
- self.assertFalse(self.GetAutofillProfile()['profiles'], |
- msg='Profile with invalid email was aggregated.') |
- |
- def testComparePhoneNumbers(self): |
- """Test phone fields parse correctly from a given profile. |
- |
- The high level key presses execute the following: Select the first text |
- field, invoke the autofill popup list, select the first profile within the |
- list, and commit to the profile to populate the form. |
- """ |
- profile_path = os.path.join(self.DataDir(), 'autofill', 'functional', |
- 'phone_pinput_autofill.txt') |
- profile_expected_path = os.path.join( |
- self.DataDir(), 'autofill', 'functional', |
- 'phone_pexpected_autofill.txt') |
- profiles = self.EvalDataFrom(profile_path) |
- profiles_expected = self.EvalDataFrom(profile_expected_path) |
- self.FillAutofillProfile(profiles=profiles) |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'form_phones.html') |
- for profile_expected in profiles_expected: |
- self.NavigateToURL(url) |
- self.assertTrue(self.AutofillPopulateForm('NAME_FIRST'), |
- msg='Autofill form could not be populated.') |
- form_values = {} |
- for key, value in profile_expected.iteritems(): |
- js_returning_field_value = ( |
- 'var field_value = document.getElementById("%s").value;' |
- 'window.domAutomationController.send(field_value);' |
- ) % key |
- form_values[key] = self.ExecuteJavascript( |
- js_returning_field_value, 0, 0) |
- self.assertEqual( |
- [form_values[key]], value, |
- msg=('Original profile not equal to expected profile at key: "%s"\n' |
- 'Expected: "%s"\nReturned: "%s"' % ( |
- key, value, [form_values[key]]))) |
- |
- def testProfileSavedWithValidCountryPhone(self): |
- """Test profile is saved if phone number is valid in selected country. |
- |
- The data file contains two profiles with valid phone numbers and two |
- profiles with invalid phone numbers from their respective country. |
- """ |
- profiles_list = self.EvalDataFrom( |
- os.path.join(self.DataDir(), 'autofill', 'functional', |
- 'phonechecker.txt')) |
- self._FillFormAndSubmit(profiles_list, 'autofill_test_form.html', |
- tab_index=0, windex=0) |
- num_profiles = len(self.GetAutofillProfile()['profiles']) |
- self.assertEqual(2, num_profiles, |
- msg='Expected 2 profiles, but got %d.' % num_profiles) |
- |
- def testCharsStrippedForAggregatedPhoneNumbers(self): |
- """Test aggregated phone numbers are standardized (not saved "as-is").""" |
- profiles_list = self.EvalDataFrom( |
- os.path.join(self.DataDir(), 'autofill', 'functional', |
- 'phonecharacters.txt')) |
- self._FillFormAndSubmit(profiles_list, 'autofill_test_form.html', |
- tab_index=0, windex=0) |
- us_phone = self.GetAutofillProfile()[ |
- 'profiles'][0]['PHONE_HOME_WHOLE_NUMBER'] |
- de_phone = self.GetAutofillProfile()[ |
- 'profiles'][1]['PHONE_HOME_WHOLE_NUMBER'] |
- self.assertEqual( |
- ['+1 408-871-4567',], us_phone, |
- msg='Aggregated US phone number %s not standardized.' % us_phone) |
- self.assertEqual( |
- ['+49 40/808179000',], de_phone, |
- msg='Aggregated Germany phone number %s not standardized.' % de_phone) |
- |
- def testAppendCountryCodeForAggregatedPhones(self): |
- """Test Autofill appends country codes to aggregated phone numbers. |
- |
- The country code is added for the following case: |
- The phone number contains the correct national number size and |
- is a valid format. |
- """ |
- profile = {'NAME_FIRST': 'Bob', |
- 'NAME_LAST': 'Smith', |
- 'ADDRESS_HOME_LINE1': '1234 H St.', |
- 'ADDRESS_HOME_CITY': 'San Jose', |
- 'ADDRESS_HOME_STATE': 'CA', |
- 'ADDRESS_HOME_ZIP': '95110', |
- 'ADDRESS_HOME_COUNTRY': 'Germany', |
- 'PHONE_HOME_WHOLE_NUMBER': '(08) 450 777-777',} |
- |
- self._FillFormAndSubmit( |
- [profile], 'autofill_test_form.html', tab_index=0, windex=0) |
- de_phone = self.GetAutofillProfile()[ |
- 'profiles'][0]['PHONE_HOME_WHOLE_NUMBER'] |
- self.assertEqual( |
- '+49', de_phone[0][:3], |
- msg='Country code missing from phone number %s.' % de_phone) |
- |
- def testCCInfoNotStoredWhenAutocompleteOff(self): |
- """Test CC info not offered to be saved when autocomplete=off for CC field. |
- |
- If the credit card number field has autocomplete turned off, then the credit |
- card infobar should not offer to save the credit card info. The credit card |
- number must be a valid Luhn number. |
- """ |
- credit_card_info = {'CREDIT_CARD_NAME': 'Bob Smith', |
- 'CREDIT_CARD_NUMBER': '4408041234567893', |
- 'CREDIT_CARD_EXP_MONTH': '12', |
- 'CREDIT_CARD_EXP_4_DIGIT_YEAR': '2014'} |
- |
- self._FillFormAndSubmit( |
- [credit_card_info], 'cc_autocomplete_off_test.html', |
- tab_index=0, windex=0) |
- cc_infobar = self.GetBrowserInfo()['windows'][0]['tabs'][0]['infobars'] |
- self.assertFalse(cc_infobar, |
- msg='Save credit card infobar offered to save CC info.') |
- |
- def testNoAutofillForReadOnlyFields(self): |
- """Test that Autofill does not fill in read-only fields.""" |
- profile = {'NAME_FIRST': ['Bob',], |
- 'NAME_LAST': ['Smith',], |
- 'EMAIL_ADDRESS': ['bsmith@gmail.com',], |
- 'ADDRESS_HOME_LINE1': ['1234 H St.',], |
- 'ADDRESS_HOME_CITY': ['San Jose',], |
- 'ADDRESS_HOME_STATE': ['CA',], |
- 'ADDRESS_HOME_ZIP': ['95110',], |
- 'COMPANY_NAME': ['Company X',], |
- 'PHONE_HOME_WHOLE_NUMBER': ['408-871-4567',],} |
- |
- self.FillAutofillProfile(profiles=[profile]) |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'read_only_field_test.html') |
- self.NavigateToURL(url) |
- self.assertTrue(self.AutofillPopulateForm('firstname'), |
- msg='Autofill form could not be populated.') |
- js_return_readonly_field = ( |
- 'var field_value = document.getElementById("email").value;' |
- 'window.domAutomationController.send(field_value);') |
- readonly_field_value = self.ExecuteJavascript( |
- js_return_readonly_field, 0, 0) |
- js_return_addrline1_field = ( |
- 'var field_value = document.getElementById("address").value;' |
- 'window.domAutomationController.send(field_value);') |
- addrline1_field_value = self.ExecuteJavascript( |
- js_return_addrline1_field, 0, 0) |
- self.assertNotEqual( |
- readonly_field_value, profile['EMAIL_ADDRESS'][0], |
- 'Autofill filled in value "%s" for a read-only field.' |
- % readonly_field_value) |
- self.assertEqual( |
- addrline1_field_value, profile['ADDRESS_HOME_LINE1'][0], |
- 'Unexpected value "%s" in the Address field.' % addrline1_field_value) |
- |
- def testFormFillableOnReset(self): |
- """Test form is fillable from a profile after form was reset. |
- |
- Steps: |
- 1. Fill form using a saved profile. |
- 2. Reset the form. |
- 3. Fill form using a saved profile. |
- """ |
- profile = {'NAME_FIRST': ['Bob',], |
- 'NAME_LAST': ['Smith',], |
- 'EMAIL_ADDRESS': ['bsmith@gmail.com',], |
- 'ADDRESS_HOME_LINE1': ['1234 H St.',], |
- 'ADDRESS_HOME_CITY': ['San Jose',], |
- 'PHONE_HOME_WHOLE_NUMBER': ['4088714567',],} |
- |
- self.FillAutofillProfile(profiles=[profile]) |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'autofill_test_form.html') |
- self.NavigateToURL(url) |
- # Fill form using an address profile. |
- self.assertTrue(self.AutofillPopulateForm('NAME_FIRST'), |
- msg='Autofill form could not be populated.') |
- # Reset the form. |
- self.ExecuteJavascript('document.getElementById("testform").reset();' |
- 'window.domAutomationController.send("done");', |
- 0, 0) |
- # Fill in the form using an Autofill profile. |
- self.assertTrue(self.AutofillPopulateForm('NAME_FIRST'), |
- msg='Autofill form could not be populated.') |
- # Verify value in fields match value in the profile dictionary. |
- form_values = {} |
- for key, value in profile.iteritems(): |
- js_returning_field_value = ( |
- 'var field_value = document.getElementById("%s").value;' |
- 'window.domAutomationController.send(field_value);' |
- ) % key |
- form_values[key] = self.ExecuteJavascript( |
- js_returning_field_value, 0, 0) |
- self.assertEqual( |
- [form_values[key]], value, |
- msg=('Original profile not equal to expected profile at key: "%s"\n' |
- 'Expected: "%s"\nReturned: "%s"' % ( |
- key, value, [form_values[key]]))) |
- |
- def testDistinguishMiddleInitialWithinName(self): |
- """Test Autofill distinguishes a middle initial in a name.""" |
- profile = {'NAME_FIRST': ['Bob',], |
- 'NAME_MIDDLE': ['Leo',], |
- 'NAME_LAST': ['Smith',], |
- 'EMAIL_ADDRESS': ['bsmith@gmail.com',], |
- 'ADDRESS_HOME_LINE1': ['1234 H St.',], |
- 'ADDRESS_HOME_CITY': ['San Jose',], |
- 'PHONE_HOME_WHOLE_NUMBER': ['4088714567',],} |
- |
- middle_initial = profile['NAME_MIDDLE'][0][0] |
- self.FillAutofillProfile(profiles=[profile]) |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'autofill_middleinit_form.html') |
- self.NavigateToURL(url) |
- # Fill form using an address profile. |
- self.assertTrue(self.AutofillPopulateForm('NAME_FIRST'), |
- msg='Autofill form could not be populated.') |
- js_return_middleinit_field = ( |
- 'var field_value = document.getElementById("NAME_MIDDLE").value;' |
- 'window.domAutomationController.send(field_value);') |
- middleinit_field_value = self.ExecuteJavascript( |
- js_return_middleinit_field, 0, 0) |
- self.assertEqual(middleinit_field_value, middle_initial, |
- msg=('Middle initial "%s" not distinguished from "%s".' % |
- (middleinit_field_value, profile['NAME_MIDDLE']))) |
- |
- def testMultipleEmailFilledByOneUserGesture(self): |
- """Test forms with multiple email addresses are filled properly. |
- |
- Entire form should be filled with one user gesture. |
- """ |
- profile = {'NAME_FIRST': ['Bob',], |
- 'NAME_LAST': ['Smith',], |
- 'EMAIL_ADDRESS': ['bsmith@gmail.com',], |
- 'PHONE_HOME_WHOLE_NUMBER': ['4088714567',],} |
- |
- self.FillAutofillProfile(profiles=[profile]) |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'autofill_confirmemail_form.html') |
- self.NavigateToURL(url) |
- # Fill form using an address profile. |
- self.assertTrue(self.AutofillPopulateForm('NAME_FIRST'), |
- msg='Autofill form could not be populated.') |
- js_return_confirmemail_field = ( |
- 'var field_value = document.getElementById("EMAIL_CONFIRM").value;' |
- 'window.domAutomationController.send(field_value);') |
- confirmemail_field_value = self.ExecuteJavascript( |
- js_return_confirmemail_field, 0, 0) |
- self.assertEqual([confirmemail_field_value], profile['EMAIL_ADDRESS'], |
- msg=('Confirmation Email address "%s" not equal to Email\n' |
- 'address "%s".' % ([confirmemail_field_value], |
- profile['EMAIL_ADDRESS']))) |
- |
- def testProfileWithEmailInOtherFieldNotSaved(self): |
- """Test profile not aggregated if email found in non-email field.""" |
- profile = {'NAME_FIRST': 'Bob', |
- 'NAME_LAST': 'Smith', |
- 'ADDRESS_HOME_LINE1': 'bsmith@gmail.com', |
- 'ADDRESS_HOME_CITY': 'San Jose', |
- 'ADDRESS_HOME_STATE': 'CA', |
- 'ADDRESS_HOME_ZIP': '95110', |
- 'COMPANY_NAME': 'Company X', |
- 'PHONE_HOME_WHOLE_NUMBER': '408-871-4567',} |
- self._FillFormAndSubmit( |
- [profile], 'duplicate_profiles_test.html', tab_index=0, windex=0) |
- self.assertFalse(self.GetAutofillProfile()['profiles'], |
- msg='Profile with email in a non-email field was ' |
- 'aggregated.') |
- |
- def FormFillLatencyAfterSubmit(self): |
- """Test latency time on form submit with lots of stored Autofill profiles. |
- |
- This test verifies when a profile is selected from the Autofill dictionary |
- that consists of thousands of profiles, the form does not hang after being |
- submitted. |
- |
- The high level key presses execute the following: Select the first text |
- field, invoke the autofill popup list, select the first profile within the |
- list, and commit to the profile to populate the form. |
- |
- This test is partially automated. The bulk of the work is done, such as |
- generating 1500 plus profiles, inserting those profiles into Autofill, |
- selecting a profile from the list. The tester will need to click on the |
- submit button and check if the browser hangs. |
- """ |
- # HTML file needs to be run from a http:// url. |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'latency_after_submit_test.html') |
- # Run the generator script to generate the dictionary list needed for the |
- # profiles. |
- gen = autofill_dataset_generator.DatasetGenerator( |
- logging_level=logging.ERROR) |
- list_of_dict = gen.GenerateDataset(num_of_dict_to_generate=1501) |
- self.FillAutofillProfile(profiles=list_of_dict) |
- self.NavigateToURL(url) |
- self.assertTrue(self.AutofillPopulateForm('NAME_FIRST'), |
- msg='Autofill form could not be populated.') |
- # TODO(dyu): add automated form hang or crash verification. |
- raw_input( |
- 'Verify the test manually. Test hang time after submitting the form.') |
- |
- |
def AutofillCrowdsourcing(self): |
"""Test able to send POST request of web form to Autofill server. |
@@ -620,111 +34,21 @@ |
# 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' |
- # Adding crowdsourcing Autofill profile. |
- file_path = os.path.join(self.DataDir(), 'autofill', 'functional', |
- 'crowdsource_autofill.txt') |
- profiles = self.EvalDataFrom(file_path) |
- self.FillAutofillProfile(profiles=profiles) |
# 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 = self.GetAutofillProfile()['profiles'][0]['NAME_FIRST'][0] |
- lname = self.GetAutofillProfile()['profiles'][0]['NAME_LAST'][0] |
- email = self.GetAutofillProfile()['profiles'][0]['EMAIL_ADDRESS'][0] |
+ 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} |
- self._WaitForWebpageFormReadyToFillIn(profile, 0, 0) |
js = ''.join(['document.getElementById("%s").value = "%s";' % |
(key, value) for key, value in profile.iteritems()]) |
js += 'document.getElementById("testform").submit();' |
- self.SubmitAutofillForm(js, tab_index=0, windex=0) |
+ self.ExecuteJavascript(js) |
- def testSameAddressProfilesAddInPrefsDontMerge(self): |
- """Test profiles added through prefs with same address do not merge.""" |
- profileA = {'NAME_FIRST': ['John',], |
- 'NAME_LAST': ['Doe',], |
- 'ADDRESS_HOME_LINE1': ['123 Cherry St',], |
- 'ADDRESS_HOME_CITY': ['Mountain View',], |
- 'ADDRESS_HOME_STATE': ['CA',], |
- 'ADDRESS_HOME_ZIP': ['94043',], |
- 'PHONE_HOME_WHOLE_NUMBER': ['650-555-1234',],} |
- profileB = {'NAME_FIRST': ['Jane',], |
- 'NAME_LAST': ['Smith',], |
- 'ADDRESS_HOME_LINE1': ['123 Cherry St',], |
- 'ADDRESS_HOME_CITY': ['Mountain View',], |
- 'ADDRESS_HOME_STATE': ['CA',], |
- 'ADDRESS_HOME_ZIP': ['94043',], |
- 'PHONE_HOME_WHOLE_NUMBER': ['650-253-1234',],} |
- |
- profiles_list = [profileA, profileB] |
- self.FillAutofillProfile(profiles=profiles_list) |
- self.assertEqual(2, len(self.GetAutofillProfile()['profiles']), |
- msg='Profiles in prefs with same address merged.') |
- |
- def testMergeAggregatedProfilesWithSameAddress(self): |
- """Test that profiles merge for aggregated data with same address. |
- |
- The criterion for when two profiles are expected to be merged is when their |
- 'Address Line 1' and 'City' data match. When two profiles are merged, any |
- remaining address fields are expected to be overwritten. Any non-address |
- fields should accumulate multi-valued data. |
- """ |
- self._AggregateProfilesIntoAutofillPrefs('dataset_2.txt') |
- # Expecting 3 profiles out of the original 14 within Autofill preferences |
- self.assertEqual(3, len(self.GetAutofillProfile()['profiles']), |
- msg='Aggregated profiles did not merge correctly.') |
- |
- def testProfilesNotMergedWhenNoMinAddressData(self): |
- """Test profiles are not merged without mininum address values. |
- |
- Mininum address values needed during aggregation are: address line 1, city, |
- state, and zip code. |
- |
- Profiles are merged when data for address line 1 and city match. |
- """ |
- self._AggregateProfilesIntoAutofillPrefs('dataset_no_address.txt') |
- self.assertFalse(self.GetAutofillProfile()['profiles'], |
- msg='Profile with no min address data was merged.') |
- |
- def MergeAggregatedDuplicatedProfiles(self): |
- """Test Autofill ability to merge duplicate profiles and throw away junk.""" |
- num_of_profiles = self._AggregateProfilesIntoAutofillPrefs('dataset.txt') |
- # Verify total number of inputted profiles is greater than the final number |
- # of profiles after merging. |
- self.assertTrue( |
- num_of_profiles > len(self.GetAutofillProfile()['profiles'])) |
- |
- def _AggregateProfilesIntoAutofillPrefs(self, data): |
- """Aggregate profiles from forms into Autofill preferences. |
- |
- Args: |
- data: Name of the data set file. |
- |
- Returns: |
- Number of profiles in the dictionary list. |
- """ |
- # HTML file needs to be run from a http:// url. |
- url = self.GetHttpURLForDataPath( |
- 'autofill', 'functional', 'duplicate_profiles_test.html') |
- # Run the parser script to generate the dictionary list needed for the |
- # profiles. |
- c = autofill_dataset_converter.DatasetConverter( |
- os.path.abspath( |
- os.path.join(self.DataDir(), 'autofill', 'functional', data)), |
- logging_level=logging.INFO) # Set verbosity to INFO, WARNING, ERROR. |
- list_of_dict = c.Convert() |
- |
- for profile in list_of_dict: |
- self.NavigateToURL(url) |
- self._WaitForWebpageFormReadyToFillIn(profile, 0, 0) |
- js = ''.join(['document.getElementById("%s").value = "%s";' % |
- (key, value) for key, value in profile.iteritems()]) |
- js += 'document.getElementById("testform").submit();' |
- self.SubmitAutofillForm(js, tab_index=0, windex=0) |
- return len(list_of_dict) |
- |
def _SelectOptionXpath(self, value): |
"""Returns an xpath query used to select an item from a dropdown list. |
Args: |