26
26
Pattern ,
27
27
TypeVar ,
28
28
Union ,
29
+ cast ,
29
30
)
30
31
31
32
from playwright ._impl ._api_structures import (
@@ -66,7 +67,13 @@ def __init__(
66
67
selector : str ,
67
68
has_text : Union [str , Pattern ] = None ,
68
69
has : "Locator" = None ,
70
+ left_of : "Locator" = None ,
71
+ right_of : "Locator" = None ,
72
+ above : "Locator" = None ,
73
+ below : "Locator" = None ,
74
+ near : "Locator" = None ,
69
75
) -> None :
76
+ _params = locals ()
70
77
self ._frame = frame
71
78
self ._selector = selector
72
79
self ._loop = frame ._loop
@@ -81,10 +88,18 @@ def __init__(
81
88
escaped = escape_with_quotes (has_text , '"' )
82
89
self ._selector += f" >> :scope:has-text({ escaped } )"
83
90
84
- if has :
85
- if has ._frame != frame :
86
- raise Error ('Inner "has" locator must belong to the same frame.' )
87
- self ._selector += " >> has=" + json .dumps (has ._selector )
91
+ for inner in ["has" , "left_of" , "right_of" , "above" , "below" , "near" ]:
92
+ locator : Optional ["Locator" ] = cast ("Locator" , _params .get (inner ))
93
+ if not locator :
94
+ continue
95
+ if locator ._frame != frame :
96
+ raise Error (f'Inner "{ inner } " locator must belong to the same frame.' )
97
+ engine_name = inner
98
+ if engine_name == "left_of" :
99
+ engine_name = "left-of"
100
+ elif engine_name == "right_of" :
101
+ engine_name = "right-of"
102
+ self ._selector += f" >> { engine_name } =" + json .dumps (locator ._selector )
88
103
89
104
def __repr__ (self ) -> str :
90
105
return f"<Locator frame={ self ._frame !r} selector={ self ._selector !r} >"
@@ -200,12 +215,22 @@ def locator(
200
215
selector : str ,
201
216
has_text : Union [str , Pattern ] = None ,
202
217
has : "Locator" = None ,
218
+ left_of : "Locator" = None ,
219
+ right_of : "Locator" = None ,
220
+ above : "Locator" = None ,
221
+ below : "Locator" = None ,
222
+ near : "Locator" = None ,
203
223
) -> "Locator" :
204
224
return Locator (
205
225
self ._frame ,
206
226
f"{ self ._selector } >> { selector } " ,
207
227
has_text = has_text ,
208
228
has = has ,
229
+ left_of = left_of ,
230
+ right_of = right_of ,
231
+ above = above ,
232
+ below = below ,
233
+ near = near ,
209
234
)
210
235
211
236
def frame_locator (self , selector : str ) -> "FrameLocator" :
@@ -236,16 +261,26 @@ def last(self) -> "Locator":
236
261
def nth (self , index : int ) -> "Locator" :
237
262
return Locator (self ._frame , f"{ self ._selector } >> nth={ index } " )
238
263
239
- def that (
264
+ def filter (
240
265
self ,
241
266
has_text : Union [str , Pattern ] = None ,
242
267
has : "Locator" = None ,
268
+ left_of : "Locator" = None ,
269
+ right_of : "Locator" = None ,
270
+ above : "Locator" = None ,
271
+ below : "Locator" = None ,
272
+ near : "Locator" = None ,
243
273
) -> "Locator" :
244
274
return Locator (
245
275
self ._frame ,
246
276
self ._selector ,
247
277
has_text = has_text ,
248
278
has = has ,
279
+ left_of = left_of ,
280
+ right_of = right_of ,
281
+ above = above ,
282
+ below = below ,
283
+ near = near ,
249
284
)
250
285
251
286
async def focus (self , timeout : float = None ) -> None :
@@ -577,13 +612,26 @@ def __init__(self, frame: "Frame", frame_selector: str) -> None:
577
612
self ._frame_selector = frame_selector
578
613
579
614
def locator (
580
- self , selector : str , has_text : Union [str , Pattern ] = None , has : "Locator" = None
615
+ self ,
616
+ selector : str ,
617
+ has_text : Union [str , Pattern ] = None ,
618
+ has : "Locator" = None ,
619
+ left_of : "Locator" = None ,
620
+ right_of : "Locator" = None ,
621
+ above : "Locator" = None ,
622
+ below : "Locator" = None ,
623
+ near : "Locator" = None ,
581
624
) -> Locator :
582
625
return Locator (
583
626
self ._frame ,
584
627
f"{ self ._frame_selector } >> control=enter-frame >> { selector } " ,
585
628
has_text = has_text ,
586
629
has = has ,
630
+ left_of = left_of ,
631
+ right_of = right_of ,
632
+ above = above ,
633
+ below = below ,
634
+ near = near ,
587
635
)
588
636
589
637
def frame_locator (self , selector : str ) -> "FrameLocator" :
0 commit comments