Chromium Code Reviews| Index: chrome/test/functional/autofill.py |
| =================================================================== |
| --- chrome/test/functional/autofill.py (revision 152261) |
| +++ 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): |
|
dyu1
2012/08/20 21:23:26
Is this partial test being covered by a browser te
jam
2012/08/20 21:26:37
yes, FormFillLatencyAfterSubmit. I also automated
|
| - """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): |
|
dyu1
2012/08/20 21:23:26
Same question here as above.
jam
2012/08/20 21:26:37
yes MergeAggregatedDuplicatedProfiles
all the tes
|
| - """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: |