@@ -244,6 +244,7 @@ def get_by_role(
244244 name : Union [str , Pattern [str ]] = None ,
245245 pressed : bool = None ,
246246 selected : bool = None ,
247+ exact : bool = None ,
247248 ) -> "Locator" :
248249 return self .locator (
249250 get_by_role_selector (
@@ -256,11 +257,12 @@ def get_by_role(
256257 name = name ,
257258 pressed = pressed ,
258259 selected = selected ,
260+ exact = exact ,
259261 )
260262 )
261263
262264 def get_by_test_id (self , testId : str ) -> "Locator" :
263- return self .locator (get_by_test_id_selector (testId ))
265+ return self .locator (get_by_test_id_selector (test_id_attribute_name (), testId ))
264266
265267 def get_by_text (
266268 self , text : Union [str , Pattern [str ]], exact : bool = None
@@ -690,6 +692,7 @@ def get_by_role(
690692 name : Union [str , Pattern [str ]] = None ,
691693 pressed : bool = None ,
692694 selected : bool = None ,
695+ exact : bool = None ,
693696 ) -> "Locator" :
694697 return self .locator (
695698 get_by_role_selector (
@@ -702,11 +705,12 @@ def get_by_role(
702705 name = name ,
703706 pressed = pressed ,
704707 selected = selected ,
708+ exact = exact ,
705709 )
706710 )
707711
708712 def get_by_test_id (self , testId : str ) -> "Locator" :
709- return self .locator (get_by_test_id_selector (testId ))
713+ return self .locator (get_by_test_id_selector (test_id_attribute_name (), testId ))
710714
711715 def get_by_text (
712716 self , text : Union [str , Pattern [str ]], exact : bool = None
@@ -739,16 +743,20 @@ def __repr__(self) -> str:
739743 return f"<FrameLocator frame={ self ._frame !r} selector={ self ._frame_selector !r} >"
740744
741745
742- test_id_attribute_name : str = "data-testid"
746+ _test_id_attribute_name : str = "data-testid"
747+
748+
749+ def test_id_attribute_name () -> str :
750+ return _test_id_attribute_name
743751
744752
745753def set_test_id_attribute_name (attribute_name : str ) -> None :
746- global test_id_attribute_name
747- test_id_attribute_name = attribute_name
754+ global _test_id_attribute_name
755+ _test_id_attribute_name = attribute_name
748756
749757
750- def get_by_test_id_selector (test_id : str ) -> str :
751- return get_by_attribute_text_selector ( test_id_attribute_name , test_id , exact = True )
758+ def get_by_test_id_selector (test_id_attribute_name : str , test_id : str ) -> str :
759+ return f"internal:testid=[ { test_id_attribute_name } = { escape_for_attribute_selector ( test_id , True )} ]"
752760
753761
754762def get_by_attribute_text_selector (
@@ -791,6 +799,7 @@ def get_by_role_selector(
791799 name : Union [str , Pattern [str ]] = None ,
792800 pressed : bool = None ,
793801 selected : bool = None ,
802+ exact : bool = None ,
794803) -> str :
795804 props : List [Tuple [str , str ]] = []
796805 if checked is not None :
@@ -811,7 +820,7 @@ def get_by_role_selector(
811820 "name" ,
812821 f"/{ name .pattern } /{ escape_regex_flags (name )} "
813822 if isinstance (name , Pattern )
814- else escape_for_attribute_selector (name ),
823+ else escape_for_attribute_selector (name , exact ),
815824 )
816825 )
817826 if pressed is not None :
0 commit comments