@@ -1266,21 +1266,17 @@ def _extract_field_value(self, element: Locator) -> str:
12661266 case "select" :
12671267 selected_option = value_from_list .locator ("option:checked" )
12681268 field_value += selected_option .inner_text ()
1269- continue
12701269 case "li" :
12711270 input_elem = value_from_list .locator ("input" )
12721271 if input_elem .is_checked ():
12731272 label_elem = value_from_list .locator ("label" )
12741273 return label_elem .inner_text ()
1275- continue
12761274 case "input" :
12771275 input_type = value_from_list .get_attribute ("type" )
12781276 if input_type == "text" :
12791277 field_value += value_from_list .input_value ()
1280- continue
12811278 case "p" :
12821279 field_value += value_from_list .inner_text ()
1283- continue
12841280 case _:
12851281 logging .debug (f"tag type not specified, tag ignored = { tag_name } " )
12861282 return field_value
@@ -1345,34 +1341,106 @@ def _process_rows_for_field_mapping(
13451341 """
13461342 for row in list_of_rows :
13471343 elements_in_row = row .locator ("xpath=.//*" ).all ()
1348- element_to_map = None
1349-
1350- for element in elements_in_row :
1351- element_class = element .get_attribute ("class" ) or ""
1352- if "label" in element_class :
1353- previous_field = field_name
1354- field_name = element .inner_text ().lower ().replace (" ?" , "" ).strip ()
1355- if field_name in fields_and_elements :
1356- name_counter = 2
1357- while f"{ field_name } ({ name_counter } )" in fields_and_elements :
1358- name_counter += 1
1359- field_name = f"{ field_name } ({ name_counter } )"
1360- elif "userInput" in element_class :
1361- element_to_map = element
1362-
1363- if field_name .replace (" " , "" ) != "" :
1364- fields_and_elements [field_name ] = element_to_map
1365- line_counter = 2
1366- else :
1367- if (
1368- hasattr (self , "list_of_multi_line_fields" )
1369- and previous_field in self .list_of_multi_line_fields
1370- ):
1371- field_name = previous_field
1372- fields_and_elements [f"{ field_name } ({ line_counter } )" ] = (
1373- element_to_map
1344+ field_name , previous_field , element_to_map = (
1345+ self ._extract_field_and_element (
1346+ elements_in_row , field_name , previous_field , fields_and_elements
1347+ )
1348+ )
1349+ if element_to_map is None :
1350+ raise ValueError (
1351+ f"Could not find element to map for field '{ field_name } '"
1352+ )
1353+ line_counter = self ._update_fields_and_elements (
1354+ fields_and_elements ,
1355+ field_name ,
1356+ previous_field ,
1357+ element_to_map ,
1358+ line_counter ,
1359+ )
1360+
1361+ def _extract_field_and_element (
1362+ self ,
1363+ elements_in_row : list ,
1364+ field_name : str ,
1365+ previous_field : str ,
1366+ fields_and_elements : dict ,
1367+ ) -> tuple [str , str , Optional [Locator ]]:
1368+ """
1369+ Extracts the field name and element to map from the elements in a row.
1370+
1371+ Args:
1372+ elements_in_row (list): List of Playwright Locator elements in the row.
1373+ field_name (str): The current field label being processed.
1374+ previous_field (str): The previous field label encountered.
1375+ fields_and_elements (dict): Dictionary to store field label to Locator mappings.
1376+
1377+ Returns:
1378+ tuple[str, str, Locator]: Updated field_name, previous_field, and element_to_map.
1379+ """
1380+ element_to_map = None
1381+ for element in elements_in_row :
1382+ element_class = element .get_attribute ("class" ) or ""
1383+ if "label" in element_class :
1384+ previous_field = field_name
1385+ field_name = element .inner_text ().lower ().replace (" ?" , "" ).strip ()
1386+ if field_name in fields_and_elements :
1387+ field_name = self ._resolve_field_name_conflict (
1388+ fields_and_elements , field_name
13741389 )
1375- line_counter += 1
1390+ elif "userInput" in element_class :
1391+ element_to_map = element
1392+ return field_name , previous_field , element_to_map
1393+
1394+ def _resolve_field_name_conflict (
1395+ self , fields_and_elements : dict , field_name : str
1396+ ) -> str :
1397+ """
1398+ Resolves field name conflicts by appending a counter.
1399+
1400+ Args:
1401+ fields_and_elements (dict): Dictionary to store field label to Locator mappings.
1402+ field_name (str): The field name to resolve.
1403+
1404+ Returns:
1405+ str: The resolved field name with a counter appended.
1406+ """
1407+ name_counter = 2
1408+ while f"{ field_name } ({ name_counter } )" in fields_and_elements :
1409+ name_counter += 1
1410+ return f"{ field_name } ({ name_counter } )"
1411+
1412+ def _update_fields_and_elements (
1413+ self ,
1414+ fields_and_elements : dict ,
1415+ field_name : str ,
1416+ previous_field : str ,
1417+ element_to_map : Locator ,
1418+ line_counter : int ,
1419+ ) -> int :
1420+ """
1421+ Updates the fields_and_elements dictionary with the field name and element, handling multi-line fields.
1422+
1423+ Args:
1424+ fields_and_elements (dict): Dictionary to store field label to Locator mappings.
1425+ field_name (str): The current field label being processed.
1426+ previous_field (str): The previous field label encountered.
1427+ element_to_map (Locator): The element to map.
1428+ line_counter (int): Counter for multi-line fields.
1429+
1430+ Returns:
1431+ int: The updated line_counter value.
1432+ """
1433+ if field_name .replace (" " , "" ) != "" :
1434+ fields_and_elements [field_name ] = element_to_map
1435+ return 2
1436+ if (
1437+ hasattr (self , "list_of_multi_line_fields" )
1438+ and previous_field in self .list_of_multi_line_fields
1439+ ):
1440+ field_name = previous_field
1441+ fields_and_elements [f"{ field_name } ({ line_counter } )" ] = element_to_map
1442+ return line_counter + 1
1443+ return line_counter
13761444
13771445 def assert_test_result (self , expected_text : str ) -> None :
13781446 """
0 commit comments