@@ -190,6 +190,7 @@ def update_form_data(
190
190
sample_data : AutofillAddressBase | CreditCardBase ,
191
191
field : str ,
192
192
value : str | int ,
193
+ region : str ,
193
194
):
194
195
"""
195
196
Update the form field with the new value.
@@ -198,6 +199,7 @@ def update_form_data(
198
199
sample_data: sample data instance used to verify change.
199
200
field: field being changed.
200
201
value: value being added.
202
+ region: region being tested.
201
203
"""
202
204
# updating the profile accordingly
203
205
self .update_and_save (field , value )
@@ -206,10 +208,12 @@ def update_form_data(
206
208
self .select_autofill_option (field )
207
209
208
210
# verifying the correct data
209
- self .verify_form_data (sample_data )
211
+ self .verify_form_data (sample_data , region )
210
212
return self
211
213
212
- def verify_form_data (self , sample_data : CreditCardBase | AutofillAddressBase ):
214
+ def verify_form_data (
215
+ self , sample_data : CreditCardBase | AutofillAddressBase , region : str = "US"
216
+ ):
213
217
"""Verify that form is filled correctly against sample data."""
214
218
if not self .field_mapping :
215
219
# Method is meant to be called by one of the classes that inherit AutoFill (CreditCardFill or AddressFill)
@@ -229,34 +233,55 @@ def verify_form_data(self, sample_data: CreditCardBase | AutofillAddressBase):
229
233
if attr_name == "cvv" :
230
234
continue
231
235
expected_value = getattr (sample_data , attr_name , None )
232
- autofilled_field = self .get_element ("form-field" , labels = [field_name ])
233
- if autofilled_field .tag_name .lower () != "select" :
234
- autofilled_field_value = autofilled_field .get_attribute ("value" )
235
- else :
236
- autofilled_field_value = Select (
237
- autofilled_field
238
- ).first_selected_option .text
239
- if (
240
- attr_name == "address_level_1"
241
- and autofilled_field_value != expected_value
242
- ):
243
- expected_value = self .util .get_state_province_abbreviation (
244
- expected_value
245
- )
246
- elif attr_name == "expiration_date" and len (autofilled_field_value ) > 5 :
247
- autofilled_field_value = autofilled_field_value .replace ("20" , "" )
248
-
249
- elif attr_name == "country" :
250
- expected_value = self .util .get_country_local_translation (expected_value )
251
- if attr_name == "expiration_month" and autofilled_field_value .isdigit ():
252
- # Handle expiration month comparison - normalize to integers to handle leading zeros
253
- autofilled_field_value = str (int (autofilled_field_value ))
254
- expected_value = str (int (expected_value ))
255
-
256
- assert expected_value in autofilled_field_value , (
257
- f"{ autofilled_field_value } is different from { expected_value } "
236
+ auto_filled_field_value = self ._get_field_value (field_name )
237
+
238
+ # Normalize values for comparison
239
+ expected_value , auto_filled_field_value = self ._normalize_values (
240
+ attr_name , expected_value , auto_filled_field_value , region
241
+ )
242
+
243
+ assert expected_value in auto_filled_field_value , (
244
+ f"Field '{ attr_name } ' ('{ field_name } '): expected '{ expected_value } ' to be in '{ auto_filled_field_value } '"
258
245
)
259
246
247
+ def _get_field_value (self , field_name : str ) -> str :
248
+ """Get the value from a form field, handling different element types."""
249
+ autofilled_field = self .get_element ("form-field" , labels = [field_name ])
250
+ if autofilled_field .tag_name .lower () != "select" :
251
+ return autofilled_field .get_attribute ("value" )
252
+ else :
253
+ return Select (autofilled_field ).first_selected_option .text
254
+
255
+ def _normalize_values (
256
+ self ,
257
+ attr_name : str ,
258
+ expected_value : str ,
259
+ auto_filled_field_value : str ,
260
+ region : str ,
261
+ ) -> tuple [str , str ]:
262
+ """Normalize expected and actual values for comparison."""
263
+ if attr_name == "address_level_1" and auto_filled_field_value != expected_value :
264
+ expected_value = self .util .get_state_province_abbreviation (expected_value )
265
+ elif attr_name == "expiration_date" and len (auto_filled_field_value ) > 5 :
266
+ auto_filled_field_value = auto_filled_field_value .replace ("20" , "" )
267
+ elif attr_name == "country" :
268
+ expected_value = self .util .get_country_local_translation (expected_value )
269
+ elif attr_name == "telephone" :
270
+ expected_value = self .util .normalize_regional_phone_numbers (
271
+ expected_value , region
272
+ )
273
+ auto_filled_field_value = self .util .normalize_regional_phone_numbers (
274
+ auto_filled_field_value , region
275
+ )
276
+
277
+ # Handle numeric fields
278
+ if attr_name == "expiration_month" and auto_filled_field_value .isdigit ():
279
+ # Handle expiration month comparison - normalize to integers to handle leading zeros
280
+ auto_filled_field_value = str (int (auto_filled_field_value ))
281
+ expected_value = str (int (expected_value ))
282
+
283
+ return expected_value , auto_filled_field_value
284
+
260
285
def verify_field_autofill_dropdown (
261
286
self ,
262
287
fields_to_test : List [str ] = None ,
@@ -433,7 +458,7 @@ def verify_all_fields_cleared(self):
433
458
434
459
@BasePage .context_chrome
435
460
def verify_autofill_data_on_hover (
436
- self , autofill_data : CreditCardBase | AutofillAddressBase
461
+ self , autofill_data : CreditCardBase | AutofillAddressBase , region : str
437
462
):
438
463
"""
439
464
Verifies that the autofill preview data matches the expected values when hovering
@@ -473,7 +498,7 @@ def verify_autofill_data_on_hover(
473
498
)
474
499
for field , value in container_data .items ():
475
500
if field in self .preview_fields :
476
- value = self .sanitize_preview_data (field , str (value ))
501
+ value = self .sanitize_preview_data (field , str (value ), region )
477
502
# Check if this value exists in our CreditCardBase | AutofillAddressBase object
478
503
is_present = any (
479
504
[value in val for val in autofill_data .__dict__ .values ()]
@@ -482,13 +507,13 @@ def verify_autofill_data_on_hover(
482
507
f"Mismatched data: { (field , value )} not in { autofill_data .__dict__ .values ()} ."
483
508
)
484
509
485
- def sanitize_preview_data (self , field , value ):
510
+ def sanitize_preview_data (self , field , value , region ):
486
511
if field == "cc-number" :
487
512
value = value [- 4 :]
488
513
elif field == "cc-exp-year" :
489
514
value = value [- 2 :]
490
515
elif field == "tel" or value [0 ] == "+" :
491
- value = self .util .normalize_phone_number (value )
516
+ value = self .util .normalize_regional_phone_numbers (value , region )
492
517
return value
493
518
494
519
def select_autofill_option (self , field , index : int = 1 ):
@@ -576,7 +601,7 @@ def check_autofill_preview_for_field(
576
601
self .double_click ("form-field" , labels = [field ])
577
602
self .autofill_popup .ensure_autofill_dropdown_visible ()
578
603
self .autofill_popup .hover ("select-form-option" )
579
- self .verify_autofill_data_on_hover (sample_data )
604
+ self .verify_autofill_data_on_hover (sample_data , region )
580
605
self .click_on ("form-field" , labels = [field ])
581
606
else :
582
607
logging .info (
@@ -636,7 +661,7 @@ def clear_and_verify(
636
661
637
662
if sample_data :
638
663
## verify data
639
- self .verify_form_data (sample_data )
664
+ self .verify_form_data (sample_data , region )
640
665
641
666
# Clear form autofill
642
667
self .double_click ("form-field" , labels = [field ])
0 commit comments