-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathext_playwright.py
More file actions
109 lines (87 loc) · 2.88 KB
/
ext_playwright.py
File metadata and controls
109 lines (87 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import socket
import logging
from typing import Optional
from playwright.sync_api import BrowserType, Playwright, Browser
from chrome import find_chrome_path
logger = logging.getLogger(__name__)
class BrowserTypeNames:
Chrome = "chrome"
Firefox = "firefox"
Webkit = "webkit"
class ExtPlaywrightOption:
"""Playwright 扩展选项"""
def __init__(
self,
skip_install_browsers: bool = False,
headless: bool = False,
browser_type: str = BrowserTypeNames.Chrome,
channel: str = "",
driver_directory: str = "",
browser_path: str = "",
user_data_dir: str = "",
remote_debugging_host: str = "",
remote_debugging_port: int = 0
):
self.skip_install_browsers = skip_install_browsers
self.headless = headless
self.browser_type = browser_type
self.channel = channel
self.driver_directory = driver_directory
self.browser_path = browser_path
self.user_data_dir = user_data_dir
self.remote_debugging_host = remote_debugging_host
self.remote_debugging_port = remote_debugging_port
def get_browser_type(self, pw: Playwright) -> BrowserType:
"""获取浏览器类型
Args:
pw: Playwright 实例
Returns:
BrowserType 实例
"""
if self.browser_type == BrowserTypeNames.Firefox:
return pw.firefox
elif self.browser_type == BrowserTypeNames.Webkit:
return pw.webkit
else:
return pw.chromium
def must_get_remote_debugging_port(self) -> int:
"""获取远程调试端口
Returns:
端口号
"""
if self.remote_debugging_port > 0:
return self.remote_debugging_port
return 9222
def must_get_browser_path(self) -> str:
"""获取浏览器路径
Returns:
浏览器可执行文件路径
"""
if self.browser_path:
return self.browser_path
chrome_path = find_chrome_path()
if not chrome_path:
raise RuntimeError("Chrome browser not found")
return chrome_path
def get_free_port() -> int:
"""获取一个空闲端口
Returns:
端口号
"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 0))
s.listen(1)
port = s.getsockname()[1]
return port
def connect_over_cdp(pw: Playwright, ext_pw_opt: ExtPlaywrightOption) -> Browser:
"""通过 CDP 连接到浏览器
Args:
pw: Playwright 实例
ext_pw_opt: 扩展选项
Returns:
Browser 实例
"""
if not ext_pw_opt.remote_debugging_host:
ext_pw_opt.remote_debugging_host = "localhost"
cdp_url = f"http://{ext_pw_opt.remote_debugging_host}:{ext_pw_opt.must_get_remote_debugging_port()}"
return pw.chromium.connect_over_cdp(cdp_url)