Best Python code snippet using playwright-python
core.py
Source:core.py
...68 return args69class ProntoClass:70 def __init__(self, vh=540, vw=960, fps=30, **kwargs):71 self.vbg = solid_color_img((vh,vw,3), alpha=0)72 store_attr(self, ','.join(dict_keys(locals_to_params(locals()))))73class Animation(ProntoClass):74 def __init__(self, temp, vh=540, vw=960, an_fn=noop, animation_dur=1, fps=30, **kwargs):75 super().__init__(**locals_to_params(locals()))76 self.an_fn = partial(an_fn, **locals_to_params(locals()))77 self.animate()78 self.durs = [x.duration for x in self.clips]79 80 def animate(self):81 x = self.an_fn(self.temp)82 if not is_list(x):83 x = [x]84 # if self.reverse:85 # x = x[::-1]86 self.an_chunks = x87 self.v = mp.ImageSequenceClip(x, fps=self.fps)88 self.clips = [self.v]89class MoveAnimation(Animation):90 def __init__(self, temp, bg=solid_color_img((540,960,3)), x1=0., y1=0., x2=0.5, y2=0.5, steps=15, fn=pto_noop, h2=None, w2=None,91 vh=540, vw=960, **kwargs):92 an_fn = move_img93 super().__init__(**locals_to_params(locals()))94class VerticalAppearAnimation(Animation):95 def __init__(self, temp, direction='up', num_chunks=5, animation_dur=1, fps=30, num_chunks_2=5, animation_dur_2=1, **kwargs):96 an_fn = animate_vertical_appear97 self.fwd = Animation(**locals_to_params(locals())).v98 self.v = self.fwd99 an_fn = partial(an_fn, reverse=True)100 num_chunks = num_chunks_2101 animation_dur = animation_dur_2102 self.bwd = Animation(**locals_to_params(locals())).v103 self.clips = [self.fwd, self.bwd]104 self.durs = [num_chunks/fps, num_chunks_2/fps]105class HorizontalAppearAnimation(Animation):106 def __init__(self, temp, direction='right', num_chunks=5, animation_dur=1, fps=30, num_chunks_2=5, animation_dur_2=1, **kwargs):107 an_fn = animate_horizontal_appear108 self.fwd = Animation(**locals_to_params(locals())).v109 self.v = self.fwd110 an_fn = partial(an_fn, reverse=True)111 num_chunks = num_chunks_2112 animation_dur = animation_dur_2113 self.bwd = Animation(**locals_to_params(locals())).v114 self.clips = [self.fwd, self.bwd]115 self.durs = [num_chunks/fps, num_chunks_2/fps]116class VerticalSlideAnimation:117 def __init__(self, temp, direction='down', num_chunks=5, bg=None, animation_dur=1, fps=30,118 num_chunks_2=5, animation_dur_2=1, **kwargs):119 an_fn = animate_vertical_slide120 self.fwd = Animation(**locals_to_params(locals())).v121 self.v = self.fwd122 an_fn = partial(an_fn, reverse=True)123 num_chunks = num_chunks_2124 animation_dur = animation_dur_2125 self.bwd = Animation(**locals_to_params(locals())).v126 self.clips = [self.fwd, self.bwd]127 self.durs = [num_chunks/fps, num_chunks_2/fps]128 129class HorizontalSlideAnimation:130 def __init__(self, temp, direction='right', num_chunks=5, bg=None, animation_dur=1, fps=30,131 num_chunks_2=5, animation_dur_2=1, **kwargs):132 an_fn = animate_horizontal_slide133 self.fwd = Animation(**locals_to_params(locals())).v134 self.v = self.fwd135 an_fn = partial(an_fn, reverse=True)136 num_chunks = num_chunks_2137 animation_dur = animation_dur_2138 self.bwd = Animation(**locals_to_params(locals())).v139 self.clips = [self.fwd, self.bwd]140 self.durs = [num_chunks/fps, num_chunks_2/fps]141 142class ZoomAnimation(Animation):143 def __init__(self, temp, direction='right', bg=None, pos=(0.,0.), num_chunks=3,144 zoom_scales=[5,1], zoom_chunks=3, **kwargs):145 an_fn = animate_zoom_appear146 super().__init__(**locals_to_params(locals()))147class OpenAnimation(Animation):148 def __init__(self, temp, direction='mv', num_chunks=5, bg=None, animation_dur=1, fps=30, **kwargs):149 an_fn = animate_open150 super().__init__(**locals_to_params(locals()))151 152class CloseAnimation(Animation):153 def __init__(self, temp, direction='mv', num_chunks=5, bg=None, animation_dur=1, fps=30, **kwargs):154 reverse = True155 an_fn = partial(animate_open, reverse=reverse)156 super().__init__(**locals_to_params(locals()))157 158class OpenCloseAnimation:159 def __init__(self, temp, direction='mv', bg=None, num_chunks=5, num_chunks_2=5,160 animation_dur=1, animation_dur_2=1, fps=30, **kwargs):161 self.open = OpenAnimation(**locals_to_params(locals())).v162 num_chunks = num_chunks_2163 animation_dur = animation_dur_2164 self.close = CloseAnimation(**locals_to_params(locals())).v165 self.clips = [self.open, self.close]166 self.durs = [num_chunks/fps, num_chunks_2/fps]167def no_effect(text='', font_size=40, font='/usr/local/share/fonts/relaxed/NotoSansTC-Medium.otf',168 color='white', align='center', wrap_width=25, start=0, end=5, fps=30, img=None, **kwargs):169 170 '''171 No special effect, just the text or image on the screen.172 Parameters:173 text (str): The text to display.174 font_size (int): The font size.175 font (str): The font to use.176 color (str or [r,g,b] list): The color of the text.177 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.178 wrap_width (int): The nuber of text characters per line.179 start (int): The starting timestamp(second) of the clip.180 end (int): The ending timestamp(second) of the clip.181 fps (int): The frames per second of the clip.182 img (str): If text is an emtpy string, this image will be used instead.183 '''184 185 duration = end-start186 clips = []187 pos = []188 times = []189 190 if len(text) > 0:191 img = text_template(text=text, wrap_width=wrap_width, font=font, font_size=font_size,192 gap=0, align=align, color=color, full_text_bg=True, text_bg_alpha=0)193 elif img is None:194 return blank_clip(duration)195 clips.append(mp.ImageClip(img, duration=duration))196 pos.append([0.5,0.5])197 times.append([0,duration])198 h,w = get_hw(img)199 return ProntoClip(clips=clips, times=times, pos=pos, start=start, end=end, fps=fps, vh=w, vw=w)200def art_effect(text='', font_size=40, color='white', font='/usr/local/share/fonts/relaxed/NotoSansTC-Medium.otf', theme=[16,184,254],201 align='center', start=0, end=5, fps=30, img=None, **kwargs):202 203 '''204 Effect adapted from the Art template.205 The text/image will be split into 3 and slide down onto the screen with a colorful bar on the left.206 Parameters:207 text (str): The text to display.208 font_size (int): The font size.209 font (str): The font to use.210 theme (str or [r,g,b] list): The color of the bar on the left.211 color (str or [r,g,b] list): The color of the text.212 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.213 wrap_width (int): The nuber of text characters per line.214 start (int): The starting timestamp(second) of the clip.215 end (int): The ending timestamp(second) of the clip.216 fps (int): The frames per second of the clip.217 img (str): If text is an emtpy string, this image will be used instead.218 '''219 220 duration = end-start221 clips = []222 pos = []223 times = []224 225 if len(text) > 0:226 img = text_template(text=text, wrap_width=55, font=font, font_size=font_size, text_bg_color=theme,227 gap=0, align=align, color=color, full_text_bg=True, text_bg_alpha=0)228 elif img is None:229 return blank_clip(duration)230 231 img_clip = mp.ImageClip(img, duration=duration)232 th,tw = get_hw(img)233 num_splits = 3234 splits = np.array_split(range(tw), num_splits)235 t1,t2,t3 = [img[:,x[0]:x[-1]+1] for x in splits]236 tws = [get_hw(t)[1] for t in [t1,t2,t3]]237 num_chunks = 5238 an_dur = num_chunks/fps239 t1_an1 = VerticalSlideAnimation(t1, direction='down', num_chunks=num_chunks).fwd240 t2_an1 = VerticalSlideAnimation(t2, direction='down', num_chunks=num_chunks).fwd241 t3_an1 = VerticalSlideAnimation(t3, direction='down', num_chunks=num_chunks).fwd242 img_clip2 = VerticalAppearAnimation(img, direction='up', num_chunks_2=num_chunks).bwd243 gap = 20244 barw = 5245 barh = th-5246 bar = solid_color_img((barh, barw, 3), color=theme)247 bar_an1 = VerticalSlideAnimation(bar, direction='down', num_chunks=num_chunks).fwd248 bar_an2 = VerticalAppearAnimation(bar, direction='up', num_chunks_2=num_chunks).bwd249 img_pos = [gap//2+barw, 0]250 clips += [t1_an1, t2_an1, t3_an1, bar_an1, bar_an2, img_clip, img_clip2]251 pos += [img_pos, [f'fwd_posx+{tws[0]}', 'fwd_posy'], [f'fwd_posx+{tws[1]}', 'fwd_posy']]252 pos += [[0, f'fwd_posy+7']]*2253 pos += [img_pos]*2254 times += [[an_dur,an_dur*4], [an_dur*2,an_dur*4], [an_dur*3,an_dur*4]]255 times += [[an_dur,duration-an_dur-an_dur], duration-an_dur-an_dur]256 times += [[an_dur*4, duration-an_dur-an_dur], duration-an_dur-an_dur]257 w = barw+tws[0]+tws[1]+tws[2]+gap258 h = max(max([get_hw(t1)[0], get_hw(t2)[0], get_hw(t3)[0]]),barh)259 return ProntoClip(clips=clips, times=times, pos=pos, start=start, end=end, fps=fps, vh=h, vw=w)260def slide_effect(text='', direction='right', font_size=40, font='/usr/local/share/fonts/relaxed/NotoSansTC-Medium.otf',261 color='white', align='center', wrap_width=25, start=0, end=5, fps=30, slide_out=True,262 img=None, **kwargs):263 264 '''265 The text/image will slide onto the screen.266 Parameters:267 text (str): The text to display.268 direction (str): The direction of the slide. Can be one of 'left', 'right', 'up', 'down'.269 font_size (int): The font size.270 font (str): The font to use.271 color (str or [r,g,b] list): The color of the text.272 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.273 wrap_width (int): The nuber of text characters per line.274 start (int): The starting timestamp(second) of the clip.275 end (int): The ending timestamp(second) of the clip.276 fps (int): The frames per second of the clip.277 img (str): If text is an emtpy string, this image will be used instead.278 slide_out (bool): If True, the text will also slide out of the screen.279 '''280 281 ans = {'down':VerticalSlideAnimation, 'up':VerticalSlideAnimation, 'right':HorizontalSlideAnimation, 'left':HorizontalSlideAnimation}282 duration = end-start283 clips = []284 pos = []285 times = []286 287 if len(text) > 0:288 img = text_template(text=text, wrap_width=wrap_width, font=font, font_size=font_size,289 gap=0, align=align, color=color, full_text_bg=True, text_bg_alpha=0)290 elif img is None:291 return blank_clip(duration)292 an = ans[direction]293 img_an = an(temp=img, direction=direction, num_chunks=5, num_chunks_2=5, fps=fps)294 clips = img_an.clips295 pos += [[0.5,0.5]]*len(clips)296 dur0, dur1 = img_an.durs297 times += [[0, duration-dur1], duration-dur1]298 h,w = get_hw(img)299 if not slide_out:300 clips = clips[:1]301 times = times[:1]302 pos = pos[:1]303 return ProntoClip(clips=clips, times=times, pos=pos, start=start, end=end, fps=fps, vh=w, vw=w)304def move_effect(text='', bg=None, x1=0., y1=0., x2=0.5, y2=0.5, steps=15, fn=pto_noop, h2=None, w2=None,305 font_size=40, font='/usr/local/share/fonts/relaxed/NotoSansTC-Medium.otf', color='white', align='center',306 wrap_width=25, start=0, end=5, fps=30, img=None, vh=540, vw=960, **kwargs):307 308 '''309 The text/image will move from position (x1,y1) to position (x2,y2).310 Parameters:311 text (str): The text to display.312 bg (image): The background on which the text/image can move around.313 If None, the background will be the entire screen based on vh and vw.314 x1 (float or int): The starting x position of the text/image.315 y1 (float or int): The starting y position of the text/image.316 x2 (float or int): The ending x position of the text/image.317 y2 (float or int): The ending y position of the text/image.318 steps (int): The number of steps/frames to move the text/image. 15 means the text/image moves for half a second if fps is 30.319 h2 (int): The final height of the text/image. If None, the text/image is not resized.320 w2 (int): The final width of the text/image. If None, the text/image is not resized.321 font_size (int): The font size.322 font (str): The font to use.323 color (str or [r,g,b] list): The color of the text.324 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.325 wrap_width (int): The nuber of text characters per line.326 start (int): The starting timestamp(second) of the clip.327 end (int): The ending timestamp(second) of the clip.328 fps (int): The frames per second of the clip.329 img (str): If text is an emtpy string, this image will be used instead.330 vh (int): The height of the overall video the text/image will be displayed on.331 vw (int): The width of the overall video the text/image will be displayed on.332 ''' 333 334 duration = end-start335 clips = []336 pos = []337 times = []338 339 if len(text) > 0:340 img = text_template(text=text, wrap_width=wrap_width, font=font, font_size=font_size,341 gap=0, align=align, color=color, full_text_bg=True, text_bg_alpha=0)342 elif img is None:343 return blank_clip(duration)344 if bg is None:345 bg = solid_color_img((vh,vw,3), alpha=0)346 clips.append(MoveAnimation(img, bg=bg, x1=x1, y1=y1, x2=x2, y2=y2, steps=steps, fn=fn, h2=h2, w2=w2, fps=fps).v)347 pos.append([0.5,0.5])348 times.append([0,-1])349 h,w = get_hw(bg)350 return ProntoClip(clips=clips, times=times, pos=pos, start=start, end=end, fps=fps, vh=h, vw=w)351def slide_move_effect(text='', direction='right', font_size=40, font='/usr/local/share/fonts/relaxed/NotoSansTC-Medium.otf',352 color='white', align='center', wrap_width=25, start=0, end=5, fps=30,353 bg=None, x1=0.5, y1=0.5, x2=0.75, y2=0.5, steps=5, fn=pto_noop, h2=None, w2=None, vh=540, vw=960,354 img=None, **kwargs):355 356 '''357 The text/image will slide in a direction and then move from position (x1,y1) to position (x2,y2).358 Parameters:359 text (str): The text to display.360 direction (str): The direction of the slide. Can be one of 'down', 'up', 'right', 'left'.361 font_size (int): The font size.362 font (str): The font to use.363 color (str or [r,g,b] list): The color of the text.364 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.365 wrap_width (int): The nuber of text characters per line.366 start (int): The starting timestamp(second) of the clip.367 end (int): The ending timestamp(second) of the clip.368 fps (int): The frames per second of the clip.369 bg (image): The background on which the text/image can move around.370 If None, the background will be the entire screen based on vh and vw.371 x1 (float or int): The starting x position of the text/image.372 y1 (float or int): The starting y position of the text/image.373 x2 (float or int): The ending x position of the text/image.374 y2 (float or int): The ending y position of the text/image.375 steps (int): The number of steps/frames to move the text/image. 15 means the text/image moves for half a second if fps is 30.376 h2 (int): The final height of the text/image. If None, the text/image is not resized.377 w2 (int): The final width of the text/image. If None, the text/image is not resized.378 vh (int): The height of the overall video the text/image will be displayed on.379 vw (int): The width of the overall video the text/image will be displayed on.380 img (str): If text is an emtpy string, this image will be used instead.381 ''' 382 383 duration = end-start384 clips = []385 pos = []386 times = []387 388 if len(text) == 0 and img is None:389 return blank_clip(duration)390 391 if bg is None:392 bg = solid_color_img((vh,vw,3), alpha=0)393 # bg_clip = mp.ImageClip(bg, duration=duration)394 395 slide_start = 0396 slide_end = 1.5397 clips.append(slide_effect(text=text, direction=direction, font_size=font_size, font=font, color=color, align=align, wrap_width=wrap_width,398 start=slide_start, end=slide_end, fps=fps, slide_out=False, img=img, **kwargs))399 pos.append([x1, y1])400 times.append([slide_start, slide_end])401 move_start = slide_end-steps/fps402 clips.append(move_effect(text=text, font_size=font_size, font=font, color=color, align=align, wrap_width=wrap_width, img=img,403 bg=bg, x1=x1, y1=y1, x2=x2, y2=y2, steps=steps, fn=fn, h2=h2, w2=w2, fps=fps, start=move_start, end=end))404 pos.append([0.,0.])405 times.append(move_start)406 print(pos)407 return ProntoClip(bg_clip='', clips=clips, times=times, pos=pos, start=start, end=end, fps=fps, vh=vh, vw=vw)408def candid_effect(text='', font_size=30, font='/usr/local/share/fonts/relaxed/NotoSansTC-Medium.otf',409 color='white', align='center', wrap_width=55, start=0, end=5, fps=30, theme='blue',410 img=None, **kwargs):411 412 '''413 Effect adapted from the Candid template. A textbox opens and closes witha grey background and bars on each side.414 Parameters:415 text (str): The text to display.416 font_size (int): The font size.417 font (str): The font to use.418 color (str or [r,g,b] list): The color of the text.419 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.420 wrap_width (int): The nuber of text characters per line.421 start (int): The starting timestamp(second) of the clip.422 end (int): The ending timestamp(second) of the clip.423 fps (int): The frames per second of the clip.424 theme (str or [r,g,b] list): The color of the bars on each side.425 img (str): If text is an emtpy string, this image will be used instead.426 ''' 427 428 duration = end-start429 pos = [[0,0]]*2430 close_dur = 3/fps431 open_end = duration-close_dur*2432 times = [[0,open_end], open_end]433 if len(text) > 0:434 text = text_case(text, 'capitalize')435 img = text_template(text=text, wrap_width=wrap_width, font=font, font_size=font_size,436 gap=10, align=align, color=color, full_text_bg=True, text_bg_alpha=170,437 text_bg_color=(40,40,40))438 elif img is None:439 return blank_clip(duration)440 441 th,tw = get_hw(img)442 line = solid_color_img((th,5,3), color=theme, alpha=225)443 img = np.concatenate([line, img, line], axis=1)444 th,tw = get_hw(img)445 446 text_an = OpenCloseAnimation(temp=img, direction='mh', num_chunks=5, num_chunks_2=3, fps=fps)447 clips = [text_an.open, text_an.close] 448 449 return ProntoClip(vh=th, vw=tw, clips=clips, pos=pos, times=times, end=duration)450def bold_effect(text='', font_size=95, font='/usr/local/share/fonts/energized/Poppins-ExtraBold.ttf', theme='blue',451 color='white', align='left', wrap_width=15, start=0, end=5, fps=30, img=None, vh=540, vw=960,452 pos=['left', 'center'], **kwargs):453 454 '''455 Effect adapted from the Bold template.456 The text splits into 3 and zooms in/out with a slightly transparent background on the whole video.457 Parameters:458 text (str): The text to display.459 font_size (int): The font size.460 font (str): The font to use.461 theme (str or [r,g,b] list): The color of the slightly transparent background.462 color (str or [r,g,b] list): The color of the text.463 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.464 wrap_width (int): The nuber of text characters per line.465 start (int): The starting timestamp(second) of the clip.466 end (int): The ending timestamp(second) of the clip.467 fps (int): The frames per second of the clip.468 img (str): If text is an emtpy string, this image will be used instead.469 vh (int): The height of the overall video the text/image will be displayed on.470 vw (int): The width of the overall video the text/image will be displayed on.471 pos (list): The [x,y] position of the text on the video.472 ''' 473 474 duration = end-start475 zoom_start = 0476 zoom_dur = min(4, duration-1)477 zoom_end = zoom_start+zoom_dur478 zoom_out_dur = 2/fps479 if len(text) > 0:480 text = text_case(text, 'upper')481 img = text_template(text=text, temp_alpha=0, align=align, temp_bg_color=theme, text_bg_alpha=0, font_size=font_size, font=font,482 wrap_width=wrap_width, gap=0, color=color)483 elif img is None:484 return blank_clip(duration)485 vbg = solid_color_img((vh,vw,3), alpha=0)486 zoom_in = ZoomAnimation(img, direction='right', bg=vbg, pos=pos, num_chunks=3, zoom_chunks=3, zoom_scales=[5,1]).v487 zoom_out = ZoomAnimation(img, direction='right', bg=vbg, pos=pos, num_chunks=1, zoom_chunks=2, zoom_scales=[1,5]).v488 zoom_bg = mp.ImageClip(solid_color_img_like(vbg, color=theme, alpha=45), duration=zoom_dur-zoom_out_dur)489 times = [zoom_start, [zoom_start, zoom_end-zoom_out_dur],zoom_end-zoom_out_dur]490 return ProntoClip(clips=[zoom_bg, zoom_in, zoom_out], vh=vh, w=vw, times=times, end=duration)491def zoom_effect(text='', font_size=95, font='/usr/local/share/fonts/energized/Poppins-ExtraBold.ttf',492 color='white', align='left', wrap_width=15, start=0, end=5, fps=30, img=None, vh=540, vw=960,493 pos=['left', 'center'], **kwargs):494 495 '''496 The text zooms in/out with a slightly transparent background on the whole video.497 Parameters:498 text (str): The text to display.499 font_size (int): The font size.500 font (str): The font to use.501 color (str or [r,g,b] list): The color of the text.502 align (str): The alignment of the text. Can be one of 'left', 'center', 'right'.503 wrap_width (int): The nuber of text characters per line.504 start (int): The starting timestamp(second) of the clip.505 end (int): The ending timestamp(second) of the clip.506 fps (int): The frames per second of the clip.507 img (str): If text is an emtpy string, this image will be used instead.508 vh (int): The height of the overall video the text/image will be displayed on.509 vw (int): The width of the overall video the text/image will be displayed on.510 pos (list): The [x,y] position of the text on the video.511 ''' 512 513 duration = end-start514 zoom_start = 0515 zoom_dur = min(4, duration-1)516 zoom_end = zoom_start+zoom_dur517 zoom_out_dur = 2/fps518 if len(text) > 0:519 text = text_case(text, 'upper')520 img = text_template(text=text, temp_alpha=0, align=align, text_bg_alpha=0, font_size=font_size, font=font,521 wrap_width=wrap_width, gap=0, color=color)522 elif img is None:523 return blank_clip(duration)524 vbg = solid_color_img((vh,vw,3), alpha=0)525 zoom_in = ZoomAnimation(img, direction='right', bg=vbg, pos=pos, num_chunks=1, zoom_chunks=3, zoom_scales=[5,1]).v526 zoom_out = ZoomAnimation(img, direction='right', bg=vbg, pos=pos, num_chunks=1, zoom_chunks=2, zoom_scales=[1,5]).v527 # zoom_bg = mp.ImageClip(solid_color_img_like(vbg, color=theme, alpha=45), duration=zoom_dur-zoom_out_dur)528 times = [[zoom_start, zoom_end-zoom_out_dur],zoom_end-zoom_out_dur]529 return ProntoClip(clips=[zoom_in, zoom_out], vh=vh, w=vw, times=times, end=duration)530def fresh_effect(text='', font_size=40, font='Poppins-ExtraBold.ttf', theme=[16,184,254],531 color='white', wrap_width=35, start=0, end=5, fps=30, img=None, **kwargs):532 533 '''534 Effect adapted from the Fresh template.535 The text background and the text slide in and out one after another.536 Parameters:537 text (str): The text to display.538 font_size (int): The font size.539 font (str): The font to use.540 theme (str or [r,g,b] list): The color of the text background.541 color (str or [r,g,b] list): The color of the text.542 wrap_width (int): The nuber of text characters per line.543 start (int): The starting timestamp(second) of the clip.544 end (int): The ending timestamp(second) of the clip.545 fps (int): The frames per second of the clip.546 img (str): If text is an emtpy string, this image will be used instead.547 ''' 548 549 duration = end-start550 # all_pos = [['left', 'top'], ['left', 'bottom'], ['center', 'center'], ['right', 'bottom'], ['right', 'top']]551 directions = ['down', 'right']552 alignement = ['left', 'right']553 ans = {'down':VerticalAppearAnimation, 'right':HorizontalAppearAnimation}554 clips = []555 pos = []556 times = []557 558 if len(text) == 0 and img is None:559 return blank_clip(duration)560 if len(text) > 0:561 # temp_pos = random.choice(all_pos)562 temp_pos = [0,0]563 bb_direction = random.choice(directions)564 temp_direction = random.choice(directions)565 trans_direction = random.choice(directions)566 bb_an = ans[bb_direction]567 temp_an = ans[temp_direction]568 trans_direction = ans[trans_direction]569 align = random.choice(alignement)570 blank_bgs, text_bgs, temp = text_template_components(text=text, align=align,571 temp_bg_color=theme, color=color,572 text_bg_alpha=210, font_size=font_size,573 font=font, wrap_width=wrap_width)574 chunks = 10575 slide_dur = chunks/fps576 bbg_dur = duration-slide_dur577 bbgs = [bb_an(bbg, direction=bb_direction, num_chunks=chunks, fps=fps).v for bbg in blank_bgs]578 clips += bbgs579 times += [[0, bbg_dur]]*len(bbgs)580 pos += [temp_pos]*len(bbgs)581 tbg_start = 0.1582 tbgs = [mp.ImageClip(tbg, duration=bbg_dur-tbg_start).set_fadein(slide_dur) for tbg in text_bgs]583 clips += tbgs584 times += [tbg_start]*len(tbgs)585 pos += [temp_pos]*len(tbgs)586 temp_v = temp_an(temp, direction=temp_direction, num_chunks=chunks, fps=fps, reverse=True).v587 clips.append(temp_v)588 times.append(bbg_dur)589 pos.append(temp_pos)590 vh,vw = get_hw(temp)591 return ProntoClip(clips=clips, pos=pos, times=times, vh=vh, vw=vw, end=duration)592def fresh_start_effect(text='', font_size=40, font='Poppins-ExtraBold.ttf', theme=[16,184,254],593 color='white', wrap_width=35, start=0, end=5, fps=30, img=None, vh=540, vw=960, pos=[0.5,0.15], **kwargs):594 duration = end-start595 text_pos = copy.deepcopy(pos)596 clips = []597 pos = []598 times = []599 bg = solid_color_img((vh, vw, 3), alpha=170, color=theme)600 clips.append(mp.ImageClip(bg, duration=duration))601 pos.append([0,0])602 times.append([0,-1])603 604 if len(text) > 0:605 temp = text_template(text=text, temp_alpha=0, align='center', text_bg_alpha=0, font_size=font_size,606 font=font, gap=0, full_text_bg=True, color=color, wrap_width=wrap_width)607 th,tw = get_hw(temp)608 text_clip = mp.ImageClip(temp, duration=duration-0.2).set_fadein(0.5)609 clips.append(text_clip)610 pos.append(text_pos)611 times.append(0.2)612 underline_clip = mp.ImageClip(solid_color_img((10, 75, 3), color=color), duration=duration-0.1).set_fadein(0.5)613 clips.append(underline_clip)614 times.append(0.1)615 pos.append([0.5,f'fwd_posy+{th+10}'])616 return ProntoClip(clips=clips, pos=pos, times=times, vh=vh, vw=vw, end=duration, fps=fps)617def sap_effect(text='', font_size1=35, font1='FranklinGothic_Bold.ttf', font_size2=25, font2='FranklinGothic-Light.ttf',618 theme=[255,215,0], color='white', start=0, end=5, fps=30, vw=960, **kwargs):619 620 duration = end-start621 clips = []622 pos = []623 times = []624 625 if len(text) == 0:626 return blank_clip(duration)627 if not is_list(text):628 text = [text]629 t1 = text[0]630 text1 = text_template(text=t1, wrap_width=25, font=font1, font_size=font_size1, gap=0,631 align='left', color=color, full_text_bg=True, text_bg_alpha=0)632 if len(text) > 1:633 t2 = text[1]634 else:635 t2 = ''636 text2 = text_template(text=t2, wrap_width=40, font=font2, font_size=font_size2, gap=0,637 align='left', color=color, full_text_bg=True, text_bg_alpha=0)638 chunks = 10639 an_dur = chunks/fps640 text1_an = HorizontalSlideAnimation(text1, direction='right', num_chunks=chunks, fps=fps).fwd641 text2_an = VerticalSlideAnimation(text2, direction='down', num_chunks=chunks, fps=30).fwd642 643 h1,w1 = get_hw(text1)644 h2,w2 = get_hw(text2)645 646 slider1 = solid_color_img(((h1+h2+10, vw//8, 3)), color=theme)647 sh,sw = get_hw(slider1)648 barw = 10649 bar = solid_color_img((sh,barw,3), color=theme)650 sh2, sw2 = sh, vw-sw+barw651 slider2 = solid_color_img((sh2,sw2,3), color=theme)652 653 slider1_an1 = HorizontalSlideAnimation(slider1, direction='right', num_chunks=chunks, fps=fps).fwd654 slider1_an2 = HorizontalSlideAnimation(slider1, direction='left', num_chunks=chunks, fps=30).bwd655 656 slider2_an1 = HorizontalSlideAnimation(slider2, direction='right', num_chunks=chunks, fps=fps).fwd657 slider2_an2 = HorizontalSlideAnimation(slider2, direction='left', num_chunks=chunks, fps=30).bwd658 bar_clip = mp.ImageClip(bar, duration=an_dur)659 660 clips = [slider1_an1, slider1_an2, bar_clip, text1_an, text2_an, slider2_an1, slider2_an2]661 pos = [[0.,0.], [0.,0.],662 [sw-barw, 0.],663 [f'fwd_posx+{barw+5}', 'fwd_posy+5'],664 ['fwd_posx', f'fwd_posy+{h1}'],665 ['fwd_posx2', 'fwd_posy2'], ['fwd_posx2', 'fwd_posy2']666 ]667 times = [0, an_dur,668 [an_dur, duration-an_dur],669 [an_dur, duration-an_dur],670 [an_dur*2, duration-an_dur],671 duration-an_dur*2,672 duration-an_dur,673 ]674 return ProntoClip(clips=clips, pos=pos, times=times, vh=sh, vw=vw, start=0, end=duration, fps=fps)675 676effects_dict = {'no_effect':no_effect, 'art_effect':art_effect, 'slide_effect':slide_effect, 'move_effect':move_effect,677 'slide_move_effect': slide_move_effect, 'candid_effect':candid_effect, 'bold_effect':bold_effect,678 'zoom_effect': zoom_effect, 'fresh_effect': fresh_effect, 'fresh_start_effect':fresh_start_effect,679 'sap_effect': sap_effect680 }681def slide_transition(v, direction='left', num_chunks=5, fps=30, vh=540, vw=960, clip_dur=5):682 if path_or_str(v):683 v = read_and_resize(v, dur=clip_dur, fps=fps, h=vh, w=vw)684 temp = first_frame(v)685 ans = {'down':VerticalSlideAnimation, 'up':VerticalSlideAnimation, 'right':HorizontalSlideAnimation, 'left':HorizontalSlideAnimation}686 an = ans[direction]687 trans_v = an(temp, direction=direction, num_chunks=num_chunks, fps=fps)688 return trans_v689def zoom_transition(v, zoom_chunks=5, zoom_scales=[0.2,1], pos=(0.5,0.5), bg=None, fps=30, vh=540, vw=960, clip_dur=5):690 if path_or_str(v):691 v = read_and_resize(v, dur=clip_dur, fps=fps, h=vh, w=vw)692 temp = first_frame(v)693 trans_v = ZoomAnimation(num_chunks=1, **locals_to_params(locals()))694 return trans_v695def fresh_transition(v, theme=[16,184,254], fps=30):696 if type(v).__name__ == 'ProntoClip':697 v = v.v698 vw,vh = v.size699 trans_direction = random.choice(['down', 'right'])700 ans = {'down':VerticalAppearAnimation, 'right':HorizontalAppearAnimation}701 trans_an = ans[trans_direction]702 return trans_an(solid_color_img((vh, vw, 3), color=theme, alpha=255),703 direction=trans_direction, num_chunks=10, fps=fps, reverse=True)704def add_transition(v, trans, start=0, end=5, fps=30):705 if trans is None:706 return v707 duration = end-start708 # print(trans['trans_name'], trans['trans_args'])709 trans_name = trans['trans_name']710 trans, trans_args = trans_dict[trans_name], trans.get('trans_args', {})711 trans = trans(v, **trans_args, fps=fps)712 trans_v = trans.v713 if 'fresh' in trans_name:714 trans_dur = 0715 else:716 trans_dur = trans.durs[0]717 vw,vh = trans_v.size718 v = ProntoClip(clips=[v,trans_v], times=[[trans_dur, -1], 0], vh=vh, vw=vw, start=0, end=duration)719 # save_video(v, 'trans.mp4')720 return v721def add_clip_effect(v, effect, fps=30):722 if effect is None:723 return v724 effect, effect_args = clip_effects_dict[effect['effect_name']], effect['effect_args']725 v = effect(v, **effect_args, fps=fps)726 return v727trans_dict = {'slide_transition': slide_transition, 'zoom_transition':zoom_transition, 'fresh_transition':fresh_transition}728def fresh_end_effect(v, start=0, end=5, theme=[16,184,254], **kwargs):729 duration = end-start730 vw,vh = v.size731 bg = solid_color_img((vh,vw,3), color=theme, alpha=255)732 bg_clip = mp.ImageClip(bg, duration=duration)733 duration = max(duration, v.duration)734 return ProntoClip(clips=[v, bg_clip], pos=[[0,0], [0,0]], times=[[0,-1], [start, end]], vh=vh, vw=vw, end=duration)735clip_effects_dict = {'fresh_end_effect':fresh_end_effect}736class ProntoClip(ProntoClass):737 def __init__(self, bg_clip='', clips=[], vh=540, vw=960, start=0, end=5, pos=[], times=[], music_files=[], music_file='',738 vo_files=[], vo_file='', logger=None,**kwargs):739 super().__init__(**locals_to_params(locals()))740 self.logger=logger741 self.duration = end-start742 self.first_frames = []743 for i,c in enumerate(self.clips):744 self.first_frames.append(first_frame(c))745 if type(c).__name__ == 'ProntoClip':746 self.clips[i] = c.v747 if path_or_str(bg_clip):748 bg_clip = str(bg_clip)749 if self.logger:750 self.logger.debug(f'**************** BG CLIP = {bg_clip}')751 if len(bg_clip) > 0:752 bg_clip = read_and_resize(bg_clip, dur=self.duration, h=vh, w=vw)753 self.first_frames.insert(0, first_frame(bg_clip))...
_page.py
Source:_page.py
...317 selector: str,318 timeout: float = None,319 state: Literal["attached", "detached", "hidden", "visible"] = None,320 ) -> Optional[ElementHandle]:321 return await self._main_frame.wait_for_selector(**locals_to_params(locals()))322 async def is_checked(self, selector: str, timeout: float = None) -> bool:323 return await self._main_frame.is_checked(**locals_to_params(locals()))324 async def is_disabled(self, selector: str, timeout: float = None) -> bool:325 return await self._main_frame.is_disabled(**locals_to_params(locals()))326 async def is_editable(self, selector: str, timeout: float = None) -> bool:327 return await self._main_frame.is_editable(**locals_to_params(locals()))328 async def is_enabled(self, selector: str, timeout: float = None) -> bool:329 return await self._main_frame.is_enabled(**locals_to_params(locals()))330 async def is_hidden(self, selector: str, timeout: float = None) -> bool:331 return await self._main_frame.is_hidden(**locals_to_params(locals()))332 async def is_visible(self, selector: str, timeout: float = None) -> bool:333 return await self._main_frame.is_visible(**locals_to_params(locals()))334 async def dispatch_event(335 self, selector: str, type: str, eventInit: Dict = None, timeout: float = None336 ) -> None:337 return await self._main_frame.dispatch_event(**locals_to_params(locals()))338 async def evaluate(self, expression: str, arg: Serializable = None) -> Any:339 return await self._main_frame.evaluate(expression, arg)340 async def evaluate_handle(341 self, expression: str, arg: Serializable = None342 ) -> JSHandle:343 return await self._main_frame.evaluate_handle(expression, arg)344 async def eval_on_selector(345 self,346 selector: str,347 expression: str,348 arg: Serializable = None,349 ) -> Any:350 return await self._main_frame.eval_on_selector(selector, expression, arg)351 async def eval_on_selector_all(352 self,353 selector: str,354 expression: str,355 arg: Serializable = None,356 ) -> Any:357 return await self._main_frame.eval_on_selector_all(selector, expression, arg)358 async def add_script_tag(359 self,360 url: str = None,361 path: Union[str, Path] = None,362 content: str = None,363 type: str = None,364 ) -> ElementHandle:365 return await self._main_frame.add_script_tag(**locals_to_params(locals()))366 async def add_style_tag(367 self, url: str = None, path: Union[str, Path] = None, content: str = None368 ) -> ElementHandle:369 return await self._main_frame.add_style_tag(**locals_to_params(locals()))370 async def expose_function(self, name: str, callback: Callable) -> None:371 await self.expose_binding(name, lambda source, *args: callback(*args))372 async def expose_binding(373 self, name: str, callback: Callable, handle: bool = None374 ) -> None:375 if name in self._bindings:376 raise Error(f'Function "{name}" has been already registered')377 if name in self._browser_context._bindings:378 raise Error(379 f'Function "{name}" has been already registered in the browser context'380 )381 self._bindings[name] = callback382 await self._channel.send(383 "exposeBinding", dict(name=name, needsHandle=handle or False)384 )385 async def set_extra_http_headers(self, headers: Dict[str, str]) -> None:386 await self._channel.send(387 "setExtraHTTPHeaders", dict(headers=serialize_headers(headers))388 )389 @property390 def url(self) -> str:391 return self._main_frame.url392 async def content(self) -> str:393 return await self._main_frame.content()394 async def set_content(395 self,396 html: str,397 timeout: float = None,398 waitUntil: DocumentLoadState = None,399 ) -> None:400 return await self._main_frame.set_content(**locals_to_params(locals()))401 async def goto(402 self,403 url: str,404 timeout: float = None,405 waitUntil: DocumentLoadState = None,406 referer: str = None,407 ) -> Optional[Response]:408 return await self._main_frame.goto(**locals_to_params(locals()))409 async def reload(410 self,411 timeout: float = None,412 waitUntil: DocumentLoadState = None,413 ) -> Optional[Response]:414 return from_nullable_channel(415 await self._channel.send("reload", locals_to_params(locals()))416 )417 async def wait_for_load_state(418 self, state: DocumentLoadState = None, timeout: float = None419 ) -> None:420 return await self._main_frame.wait_for_load_state(**locals_to_params(locals()))421 async def wait_for_event(422 self, event: str, predicate: Callable = None, timeout: float = None423 ) -> Any:424 async with self.expect_event(event, predicate, timeout) as event_info:425 pass426 return await event_info427 async def go_back(428 self,429 timeout: float = None,430 waitUntil: DocumentLoadState = None,431 ) -> Optional[Response]:432 return from_nullable_channel(433 await self._channel.send("goBack", locals_to_params(locals()))434 )435 async def go_forward(436 self,437 timeout: float = None,438 waitUntil: DocumentLoadState = None,439 ) -> Optional[Response]:440 return from_nullable_channel(441 await self._channel.send("goForward", locals_to_params(locals()))442 )443 async def emulate_media(444 self,445 media: Literal["print", "screen"] = None,446 colorScheme: ColorScheme = None,447 ) -> None:448 await self._channel.send("emulateMedia", locals_to_params(locals()))449 async def set_viewport_size(self, viewportSize: ViewportSize) -> None:450 self._viewport_size = viewportSize451 await self._channel.send("setViewportSize", locals_to_params(locals()))452 @property453 def viewport_size(self) -> Optional[ViewportSize]:454 return self._viewport_size455 async def bring_to_front(self) -> None:456 await self._channel.send("bringToFront")457 async def add_init_script(458 self, script: str = None, path: Union[str, Path] = None459 ) -> None:460 if path:461 with open(path, "r") as file:462 script = file.read()463 if not isinstance(script, str):464 raise Error("Either path or source parameter must be specified")465 await self._channel.send("addInitScript", dict(source=script))466 async def route(self, url: URLMatch, handler: RouteHandler) -> None:467 self._routes.append(RouteHandlerEntry(URLMatcher(url), handler))468 if len(self._routes) == 1:469 await self._channel.send(470 "setNetworkInterceptionEnabled", dict(enabled=True)471 )472 async def unroute(473 self, url: URLMatch, handler: Optional[RouteHandler] = None474 ) -> None:475 self._routes = list(476 filter(477 lambda r: r.matcher.match != url or (handler and r.handler != handler),478 self._routes,479 )480 )481 if len(self._routes) == 0:482 await self._channel.send(483 "setNetworkInterceptionEnabled", dict(enabled=False)484 )485 async def screenshot(486 self,487 timeout: float = None,488 type: Literal["jpeg", "png"] = None,489 path: Union[str, Path] = None,490 quality: int = None,491 omitBackground: bool = None,492 fullPage: bool = None,493 clip: FloatRect = None,494 ) -> bytes:495 params = locals_to_params(locals())496 if "path" in params:497 del params["path"]498 encoded_binary = await self._channel.send("screenshot", params)499 decoded_binary = base64.b64decode(encoded_binary)500 if path:501 with open(path, "wb") as fd:502 fd.write(decoded_binary)503 return decoded_binary504 async def title(self) -> str:505 return await self._main_frame.title()506 async def close(self, runBeforeUnload: bool = None) -> None:507 try:508 await self._channel.send("close", locals_to_params(locals()))509 if self._owned_context:510 await self._owned_context.close()511 except Exception as e:512 if not is_safe_close_error(e):513 raise e514 def is_closed(self) -> bool:515 return self._is_closed516 async def click(517 self,518 selector: str,519 modifiers: List[KeyboardModifier] = None,520 position: Position = None,521 delay: float = None,522 button: MouseButton = None,523 clickCount: int = None,524 timeout: float = None,525 force: bool = None,526 noWaitAfter: bool = None,527 ) -> None:528 return await self._main_frame.click(**locals_to_params(locals()))529 async def dblclick(530 self,531 selector: str,532 modifiers: List[KeyboardModifier] = None,533 position: Position = None,534 delay: float = None,535 button: MouseButton = None,536 timeout: float = None,537 force: bool = None,538 noWaitAfter: bool = None,539 ) -> None:540 return await self._main_frame.dblclick(**locals_to_params(locals()))541 async def tap(542 self,543 selector: str,544 modifiers: List[KeyboardModifier] = None,545 position: Position = None,546 timeout: float = None,547 force: bool = None,548 noWaitAfter: bool = None,549 ) -> None:550 return await self._main_frame.tap(**locals_to_params(locals()))551 async def fill(552 self, selector: str, value: str, timeout: float = None, noWaitAfter: bool = None553 ) -> None:554 return await self._main_frame.fill(**locals_to_params(locals()))555 async def focus(self, selector: str, timeout: float = None) -> None:556 return await self._main_frame.focus(**locals_to_params(locals()))557 async def text_content(self, selector: str, timeout: float = None) -> Optional[str]:558 return await self._main_frame.text_content(**locals_to_params(locals()))559 async def inner_text(self, selector: str, timeout: float = None) -> str:560 return await self._main_frame.inner_text(**locals_to_params(locals()))561 async def inner_html(self, selector: str, timeout: float = None) -> str:562 return await self._main_frame.inner_html(**locals_to_params(locals()))563 async def get_attribute(564 self, selector: str, name: str, timeout: float = None565 ) -> Optional[str]:566 return await self._main_frame.get_attribute(**locals_to_params(locals()))567 async def hover(568 self,569 selector: str,570 modifiers: List[KeyboardModifier] = None,571 position: Position = None,572 timeout: float = None,573 force: bool = None,574 ) -> None:575 return await self._main_frame.hover(**locals_to_params(locals()))576 async def select_option(577 self,578 selector: str,579 value: Union[str, List[str]] = None,580 index: Union[int, List[int]] = None,581 label: Union[str, List[str]] = None,582 element: Union["ElementHandle", List["ElementHandle"]] = None,583 timeout: float = None,584 noWaitAfter: bool = None,585 ) -> List[str]:586 params = locals_to_params(locals())587 return await self._main_frame.select_option(**params)588 async def set_input_files(589 self,590 selector: str,591 files: Union[str, Path, FilePayload, List[Union[str, Path]], List[FilePayload]],592 timeout: float = None,593 noWaitAfter: bool = None,594 ) -> None:595 return await self._main_frame.set_input_files(**locals_to_params(locals()))596 async def type(597 self,598 selector: str,599 text: str,600 delay: float = None,601 timeout: float = None,602 noWaitAfter: bool = None,603 ) -> None:604 return await self._main_frame.type(**locals_to_params(locals()))605 async def press(606 self,607 selector: str,608 key: str,609 delay: float = None,610 timeout: float = None,611 noWaitAfter: bool = None,612 ) -> None:613 return await self._main_frame.press(**locals_to_params(locals()))614 async def check(615 self,616 selector: str,617 timeout: float = None,618 force: bool = None,619 noWaitAfter: bool = None,620 ) -> None:621 return await self._main_frame.check(**locals_to_params(locals()))622 async def uncheck(623 self,624 selector: str,625 timeout: float = None,626 force: bool = None,627 noWaitAfter: bool = None,628 ) -> None:629 return await self._main_frame.uncheck(**locals_to_params(locals()))630 async def wait_for_timeout(self, timeout: float) -> None:631 await self._main_frame.wait_for_timeout(timeout)632 async def wait_for_function(633 self,634 expression: str,635 arg: Serializable = None,636 timeout: float = None,637 polling: Union[float, Literal["raf"]] = None,638 ) -> JSHandle:639 return await self._main_frame.wait_for_function(**locals_to_params(locals()))640 @property641 def workers(self) -> List["Worker"]:642 return self._workers.copy()643 async def pause(self) -> None:644 await self._browser_context._pause()645 async def pdf(646 self,647 scale: float = None,648 displayHeaderFooter: bool = None,649 headerTemplate: str = None,650 footerTemplate: str = None,651 printBackground: bool = None,652 landscape: bool = None,653 pageRanges: str = None,654 format: str = None,655 width: Union[str, float] = None,656 height: Union[str, float] = None,657 preferCSSPageSize: bool = None,658 margin: PdfMargins = None,659 path: Union[str, Path] = None,660 ) -> bytes:661 params = locals_to_params(locals())662 if "path" in params:663 del params["path"]664 encoded_binary = await self._channel.send("pdf", params)665 decoded_binary = base64.b64decode(encoded_binary)666 if path:667 with open(path, "wb") as fd:668 fd.write(decoded_binary)669 return decoded_binary670 @property671 def video(672 self,673 ) -> Optional[Video]:674 context_options = self._browser_context._options675 if "recordVideo" not in context_options:...
_locator.py
Source:_locator.py
...110 force: bool = None,111 noWaitAfter: bool = None,112 trial: bool = None,113 ) -> None:114 params = locals_to_params(locals())115 return await self._frame.check(self._selector, strict=True, **params)116 async def click(117 self,118 modifiers: List[KeyboardModifier] = None,119 position: Position = None,120 delay: float = None,121 button: MouseButton = None,122 clickCount: int = None,123 timeout: float = None,124 force: bool = None,125 noWaitAfter: bool = None,126 trial: bool = None,127 ) -> None:128 params = locals_to_params(locals())129 return await self._frame.click(self._selector, strict=True, **params)130 async def dblclick(131 self,132 modifiers: List[KeyboardModifier] = None,133 position: Position = None,134 delay: float = None,135 button: MouseButton = None,136 timeout: float = None,137 force: bool = None,138 noWaitAfter: bool = None,139 trial: bool = None,140 ) -> None:141 params = locals_to_params(locals())142 return await self._frame.dblclick(self._selector, strict=True, **params)143 async def dispatch_event(144 self,145 type: str,146 eventInit: Dict = None,147 timeout: float = None,148 ) -> None:149 params = locals_to_params(locals())150 return await self._frame.dispatch_event(self._selector, strict=True, **params)151 async def evaluate(152 self, expression: str, arg: Serializable = None, timeout: float = None153 ) -> Any:154 return await self._with_element(155 lambda h, _: h.evaluate(expression, arg),156 timeout,157 )158 async def evaluate_all(self, expression: str, arg: Serializable = None) -> Any:159 params = locals_to_params(locals())160 return await self._frame.eval_on_selector_all(self._selector, **params)161 async def evaluate_handle(162 self, expression: str, arg: Serializable = None, timeout: float = None163 ) -> "JSHandle":164 return await self._with_element(165 lambda h, o: h.evaluate_handle(expression, arg), timeout166 )167 async def fill(168 self,169 value: str,170 timeout: float = None,171 noWaitAfter: bool = None,172 force: bool = None,173 ) -> None:174 params = locals_to_params(locals())175 return await self._frame.fill(self._selector, strict=True, **params)176 def locator(177 self,178 selector: str,179 has_text: Union[str, Pattern] = None,180 has: "Locator" = None,181 ) -> "Locator":182 return Locator(183 self._frame,184 f"{self._selector} >> {selector}",185 has_text=has_text,186 has=has,187 )188 def frame_locator(self, selector: str) -> "FrameLocator":189 return FrameLocator(self._frame, self._selector + " >> " + selector)190 async def element_handle(191 self,192 timeout: float = None,193 ) -> ElementHandle:194 params = locals_to_params(locals())195 handle = await self._frame.wait_for_selector(196 self._selector, strict=True, state="attached", **params197 )198 assert handle199 return handle200 async def element_handles(self) -> List[ElementHandle]:201 return await self._frame.query_selector_all(self._selector)202 @property203 def first(self) -> "Locator":204 return Locator(self._frame, f"{self._selector} >> nth=0")205 @property206 def last(self) -> "Locator":207 return Locator(self._frame, f"{self._selector} >> nth=-1")208 def nth(self, index: int) -> "Locator":209 return Locator(self._frame, f"{self._selector} >> nth={index}")210 async def focus(self, timeout: float = None) -> None:211 params = locals_to_params(locals())212 return await self._frame.focus(self._selector, strict=True, **params)213 async def count(214 self,215 ) -> int:216 return await self._frame._query_count(self._selector)217 async def drag_to(218 self,219 target: "Locator",220 force: bool = None,221 noWaitAfter: bool = None,222 timeout: float = None,223 trial: bool = None,224 sourcePosition: Position = None,225 targetPosition: Position = None,226 ) -> None:227 params = locals_to_params(locals())228 del params["target"]229 return await self._frame.drag_and_drop(230 self._selector, target._selector, strict=True, **params231 )232 async def get_attribute(self, name: str, timeout: float = None) -> Optional[str]:233 params = locals_to_params(locals())234 return await self._frame.get_attribute(235 self._selector,236 strict=True,237 **params,238 )239 async def hover(240 self,241 modifiers: List[KeyboardModifier] = None,242 position: Position = None,243 timeout: float = None,244 force: bool = None,245 trial: bool = None,246 ) -> None:247 params = locals_to_params(locals())248 return await self._frame.hover(249 self._selector,250 strict=True,251 **params,252 )253 async def inner_html(self, timeout: float = None) -> str:254 params = locals_to_params(locals())255 return await self._frame.inner_html(256 self._selector,257 strict=True,258 **params,259 )260 async def inner_text(self, timeout: float = None) -> str:261 params = locals_to_params(locals())262 return await self._frame.inner_text(263 self._selector,264 strict=True,265 **params,266 )267 async def input_value(self, timeout: float = None) -> str:268 params = locals_to_params(locals())269 return await self._frame.input_value(270 self._selector,271 strict=True,272 **params,273 )274 async def is_checked(self, timeout: float = None) -> bool:275 params = locals_to_params(locals())276 return await self._frame.is_checked(277 self._selector,278 strict=True,279 **params,280 )281 async def is_disabled(self, timeout: float = None) -> bool:282 params = locals_to_params(locals())283 return await self._frame.is_disabled(284 self._selector,285 strict=True,286 **params,287 )288 async def is_editable(self, timeout: float = None) -> bool:289 params = locals_to_params(locals())290 return await self._frame.is_editable(291 self._selector,292 strict=True,293 **params,294 )295 async def is_enabled(self, timeout: float = None) -> bool:296 params = locals_to_params(locals())297 return await self._frame.is_editable(298 self._selector,299 strict=True,300 **params,301 )302 async def is_hidden(self, timeout: float = None) -> bool:303 params = locals_to_params(locals())304 return await self._frame.is_hidden(305 self._selector,306 strict=True,307 **params,308 )309 async def is_visible(self, timeout: float = None) -> bool:310 params = locals_to_params(locals())311 return await self._frame.is_visible(312 self._selector,313 strict=True,314 **params,315 )316 async def press(317 self,318 key: str,319 delay: float = None,320 timeout: float = None,321 noWaitAfter: bool = None,322 ) -> None:323 params = locals_to_params(locals())324 return await self._frame.press(self._selector, strict=True, **params)325 async def screenshot(326 self,327 timeout: float = None,328 type: Literal["jpeg", "png"] = None,329 path: Union[str, pathlib.Path] = None,330 quality: int = None,331 omitBackground: bool = None,332 animations: Literal["allow", "disabled"] = None,333 caret: Literal["hide", "initial"] = None,334 scale: Literal["css", "device"] = None,335 mask: List["Locator"] = None,336 ) -> bytes:337 params = locals_to_params(locals())338 return await self._with_element(339 lambda h, timeout: h.screenshot(timeout=timeout, **params)340 )341 async def scroll_into_view_if_needed(342 self,343 timeout: float = None,344 ) -> None:345 return await self._with_element(346 lambda h, timeout: h.scroll_into_view_if_needed(timeout=timeout),347 timeout,348 )349 async def select_option(350 self,351 value: Union[str, List[str]] = None,352 index: Union[int, List[int]] = None,353 label: Union[str, List[str]] = None,354 element: Union["ElementHandle", List["ElementHandle"]] = None,355 timeout: float = None,356 noWaitAfter: bool = None,357 force: bool = None,358 ) -> List[str]:359 params = locals_to_params(locals())360 return await self._frame.select_option(361 self._selector,362 strict=True,363 **params,364 )365 async def select_text(self, force: bool = None, timeout: float = None) -> None:366 params = locals_to_params(locals())367 return await self._with_element(368 lambda h, timeout: h.select_text(timeout=timeout, **params), timeout369 )370 async def set_input_files(371 self,372 files: Union[373 str,374 pathlib.Path,375 FilePayload,376 List[Union[str, pathlib.Path]],377 List[FilePayload],378 ],379 timeout: float = None,380 noWaitAfter: bool = None,381 ) -> None:382 params = locals_to_params(locals())383 return await self._frame.set_input_files(384 self._selector,385 strict=True,386 **params,387 )388 async def tap(389 self,390 modifiers: List[KeyboardModifier] = None,391 position: Position = None,392 timeout: float = None,393 force: bool = None,394 noWaitAfter: bool = None,395 trial: bool = None,396 ) -> None:397 params = locals_to_params(locals())398 return await self._frame.tap(399 self._selector,400 strict=True,401 **params,402 )403 async def text_content(self, timeout: float = None) -> Optional[str]:404 params = locals_to_params(locals())405 return await self._frame.text_content(406 self._selector,407 strict=True,408 **params,409 )410 async def type(411 self,412 text: str,413 delay: float = None,414 timeout: float = None,415 noWaitAfter: bool = None,416 ) -> None:417 params = locals_to_params(locals())418 return await self._frame.type(419 self._selector,420 strict=True,421 **params,422 )423 async def uncheck(424 self,425 position: Position = None,426 timeout: float = None,427 force: bool = None,428 noWaitAfter: bool = None,429 trial: bool = None,430 ) -> None:431 params = locals_to_params(locals())432 return await self._frame.uncheck(433 self._selector,434 strict=True,435 **params,436 )437 async def all_inner_texts(438 self,439 ) -> List[str]:440 return await self._frame.eval_on_selector_all(441 self._selector, "ee => ee.map(e => e.innerText)"442 )443 async def all_text_contents(444 self,445 ) -> List[str]:...
_frame.py
Source:_frame.py
...99 ) -> Optional[Response]:100 return cast(101 Optional[Response],102 from_nullable_channel(103 await self._channel.send("goto", locals_to_params(locals()))104 ),105 )106 def _setup_navigation_wait_helper(self, timeout: float = None) -> WaitHelper:107 wait_helper = WaitHelper(self._loop)108 wait_helper.reject_on_event(109 self._page, "close", Error("Navigation failed because page was closed!")110 )111 wait_helper.reject_on_event(112 self._page, "crash", Error("Navigation failed because page crashed!")113 )114 wait_helper.reject_on_event(115 self._page,116 "framedetached",117 Error("Navigating frame was detached!"),118 lambda frame: frame == self,119 )120 if timeout is None:121 timeout = self._page._timeout_settings.navigation_timeout()122 wait_helper.reject_on_timeout(timeout, f"Timeout {timeout}ms exceeded.")123 return wait_helper124 def expect_navigation(125 self,126 url: URLMatch = None,127 wait_until: DocumentLoadState = None,128 timeout: float = None,129 ) -> EventContextManagerImpl[Response]:130 if not wait_until:131 wait_until = "load"132 if timeout is None:133 timeout = self._page._timeout_settings.navigation_timeout()134 deadline = monotonic_time() + timeout135 wait_helper = self._setup_navigation_wait_helper(timeout)136 matcher = URLMatcher(url) if url else None137 def predicate(event: Any) -> bool:138 # Any failed navigation results in a rejection.139 if event.get("error"):140 return True141 return not matcher or matcher.matches(event["url"])142 wait_helper.wait_for_event(143 self._event_emitter,144 "navigated",145 predicate=predicate,146 )147 async def continuation() -> Optional[Response]:148 event = await wait_helper.result()149 if "error" in event:150 raise Error(event["error"])151 if wait_until not in self._load_states:152 t = deadline - monotonic_time()153 if t > 0:154 await self.wait_for_load_state(state=wait_until, timeout=t)155 if "newDocument" in event and "request" in event["newDocument"]:156 request = from_channel(event["newDocument"]["request"])157 return await request.response()158 return None159 return EventContextManagerImpl(asyncio.create_task(continuation()))160 async def wait_for_load_state(161 self, state: DocumentLoadState = None, timeout: float = None162 ) -> None:163 if not state:164 state = "load"165 if state not in ("load", "domcontentloaded", "networkidle"):166 raise Error("state: expected one of (load|domcontentloaded|networkidle)")167 if state in self._load_states:168 return169 wait_helper = self._setup_navigation_wait_helper(timeout)170 wait_helper.wait_for_event(171 self._event_emitter, "loadstate", lambda s: s == state172 )173 await wait_helper.result()174 async def frame_element(self) -> ElementHandle:175 return from_channel(await self._channel.send("frameElement"))176 async def evaluate(self, expression: str, arg: Serializable = None) -> Any:177 return parse_result(178 await self._channel.send(179 "evaluateExpression",180 dict(181 expression=expression,182 arg=serialize_argument(arg),183 ),184 )185 )186 async def evaluate_handle(187 self, expression: str, arg: Serializable = None188 ) -> JSHandle:189 return from_channel(190 await self._channel.send(191 "evaluateExpressionHandle",192 dict(193 expression=expression,194 arg=serialize_argument(arg),195 ),196 )197 )198 async def query_selector(self, selector: str) -> Optional[ElementHandle]:199 return from_nullable_channel(200 await self._channel.send("querySelector", dict(selector=selector))201 )202 async def query_selector_all(self, selector: str) -> List[ElementHandle]:203 return list(204 map(205 cast(ElementHandle, from_channel),206 await self._channel.send("querySelectorAll", dict(selector=selector)),207 )208 )209 async def wait_for_selector(210 self,211 selector: str,212 timeout: float = None,213 state: Literal["attached", "detached", "hidden", "visible"] = None,214 ) -> Optional[ElementHandle]:215 return from_nullable_channel(216 await self._channel.send("waitForSelector", locals_to_params(locals()))217 )218 async def is_checked(self, selector: str, timeout: float = None) -> bool:219 return await self._channel.send("isChecked", locals_to_params(locals()))220 async def is_disabled(self, selector: str, timeout: float = None) -> bool:221 return await self._channel.send("isDisabled", locals_to_params(locals()))222 async def is_editable(self, selector: str, timeout: float = None) -> bool:223 return await self._channel.send("isEditable", locals_to_params(locals()))224 async def is_enabled(self, selector: str, timeout: float = None) -> bool:225 return await self._channel.send("isEnabled", locals_to_params(locals()))226 async def is_hidden(self, selector: str, timeout: float = None) -> bool:227 return await self._channel.send("isHidden", locals_to_params(locals()))228 async def is_visible(self, selector: str, timeout: float = None) -> bool:229 return await self._channel.send("isVisible", locals_to_params(locals()))230 async def dispatch_event(231 self, selector: str, type: str, eventInit: Dict = None, timeout: float = None232 ) -> None:233 await self._channel.send(234 "dispatchEvent",235 dict(selector=selector, type=type, eventInit=serialize_argument(eventInit)),236 )237 async def eval_on_selector(238 self,239 selector: str,240 expression: str,241 arg: Serializable = None,242 ) -> Any:243 return parse_result(244 await self._channel.send(245 "evalOnSelector",246 dict(247 selector=selector,248 expression=expression,249 arg=serialize_argument(arg),250 ),251 )252 )253 async def eval_on_selector_all(254 self,255 selector: str,256 expression: str,257 arg: Serializable = None,258 ) -> Any:259 return parse_result(260 await self._channel.send(261 "evalOnSelectorAll",262 dict(263 selector=selector,264 expression=expression,265 arg=serialize_argument(arg),266 ),267 )268 )269 async def content(self) -> str:270 return await self._channel.send("content")271 async def set_content(272 self,273 html: str,274 timeout: float = None,275 waitUntil: DocumentLoadState = None,276 ) -> None:277 await self._channel.send("setContent", locals_to_params(locals()))278 @property279 def name(self) -> str:280 return self._name or ""281 @property282 def url(self) -> str:283 return self._url or ""284 @property285 def parent_frame(self) -> Optional["Frame"]:286 return self._parent_frame287 @property288 def child_frames(self) -> List["Frame"]:289 return self._child_frames.copy()290 def is_detached(self) -> bool:291 return self._detached292 async def add_script_tag(293 self,294 url: str = None,295 path: Union[str, Path] = None,296 content: str = None,297 type: str = None,298 ) -> ElementHandle:299 params = locals_to_params(locals())300 if path:301 with open(path, "r") as file:302 params["content"] = file.read() + "\n//# sourceURL=" + str(Path(path))303 del params["path"]304 return from_channel(await self._channel.send("addScriptTag", params))305 async def add_style_tag(306 self, url: str = None, path: Union[str, Path] = None, content: str = None307 ) -> ElementHandle:308 params = locals_to_params(locals())309 if path:310 with open(path, "r") as file:311 params["content"] = (312 file.read() + "\n/*# sourceURL=" + str(Path(path)) + "*/"313 )314 del params["path"]315 return from_channel(await self._channel.send("addStyleTag", params))316 async def click(317 self,318 selector: str,319 modifiers: List[KeyboardModifier] = None,320 position: Position = None,321 delay: float = None,322 button: MouseButton = None,323 clickCount: int = None,324 timeout: float = None,325 force: bool = None,326 noWaitAfter: bool = None,327 ) -> None:328 await self._channel.send("click", locals_to_params(locals()))329 async def dblclick(330 self,331 selector: str,332 modifiers: List[KeyboardModifier] = None,333 position: Position = None,334 delay: float = None,335 button: MouseButton = None,336 timeout: float = None,337 force: bool = None,338 noWaitAfter: bool = None,339 ) -> None:340 await self._channel.send("dblclick", locals_to_params(locals()))341 async def tap(342 self,343 selector: str,344 modifiers: List[KeyboardModifier] = None,345 position: Position = None,346 timeout: float = None,347 force: bool = None,348 noWaitAfter: bool = None,349 ) -> None:350 await self._channel.send("tap", locals_to_params(locals()))351 async def fill(352 self, selector: str, value: str, timeout: float = None, noWaitAfter: bool = None353 ) -> None:354 await self._channel.send("fill", locals_to_params(locals()))355 async def focus(self, selector: str, timeout: float = None) -> None:356 await self._channel.send("focus", locals_to_params(locals()))357 async def text_content(self, selector: str, timeout: float = None) -> Optional[str]:358 return await self._channel.send("textContent", locals_to_params(locals()))359 async def inner_text(self, selector: str, timeout: float = None) -> str:360 return await self._channel.send("innerText", locals_to_params(locals()))361 async def inner_html(self, selector: str, timeout: float = None) -> str:362 return await self._channel.send("innerHTML", locals_to_params(locals()))363 async def get_attribute(364 self, selector: str, name: str, timeout: float = None365 ) -> Optional[str]:366 return await self._channel.send("getAttribute", locals_to_params(locals()))367 async def hover(368 self,369 selector: str,370 modifiers: List[KeyboardModifier] = None,371 position: Position = None,372 timeout: float = None,373 force: bool = None,374 ) -> None:375 await self._channel.send("hover", locals_to_params(locals()))376 async def select_option(377 self,378 selector: str,379 value: Union[str, List[str]] = None,380 index: Union[int, List[int]] = None,381 label: Union[str, List[str]] = None,382 element: Union["ElementHandle", List["ElementHandle"]] = None,383 timeout: float = None,384 noWaitAfter: bool = None,385 ) -> List[str]:386 params = locals_to_params(387 dict(388 selector=selector,389 timeout=timeout,390 noWaitAfter=noWaitAfter,391 **convert_select_option_values(value, index, label, element),392 )393 )394 return await self._channel.send("selectOption", params)395 async def set_input_files(396 self,397 selector: str,398 files: Union[str, Path, FilePayload, List[Union[str, Path]], List[FilePayload]],399 timeout: float = None,400 noWaitAfter: bool = None,401 ) -> None:402 params = locals_to_params(locals())403 params["files"] = normalize_file_payloads(files)404 await self._channel.send("setInputFiles", params)405 async def type(406 self,407 selector: str,408 text: str,409 delay: float = None,410 timeout: float = None,411 noWaitAfter: bool = None,412 ) -> None:413 await self._channel.send("type", locals_to_params(locals()))414 async def press(415 self,416 selector: str,417 key: str,418 delay: float = None,419 timeout: float = None,420 noWaitAfter: bool = None,421 ) -> None:422 await self._channel.send("press", locals_to_params(locals()))423 async def check(424 self,425 selector: str,426 timeout: float = None,427 force: bool = None,428 noWaitAfter: bool = None,429 ) -> None:430 await self._channel.send("check", locals_to_params(locals()))431 async def uncheck(432 self,433 selector: str,434 timeout: float = None,435 force: bool = None,436 noWaitAfter: bool = None,437 ) -> None:438 await self._channel.send("uncheck", locals_to_params(locals()))439 async def wait_for_timeout(self, timeout: float) -> None:440 await self._connection._loop.create_task(asyncio.sleep(timeout / 1000))441 async def wait_for_function(442 self,443 expression: str,444 arg: Serializable = None,445 timeout: float = None,446 polling: Union[float, Literal["raf"]] = None,447 ) -> JSHandle:448 params = locals_to_params(locals())449 params["arg"] = serialize_argument(arg)450 return from_channel(await self._channel.send("waitForFunction", params))451 async def title(self) -> str:...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!