Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
seleniumhq
GitHub Repository: seleniumhq/selenium
Path: blob/trunk/scripts/update_cdp.py
2864 views
1
#!/usr/bin/env python
2
3
import argparse
4
import json
5
import os
6
import re
7
import shutil
8
import subprocess
9
from pathlib import Path
10
11
import urllib3
12
from packaging.version import parse
13
14
http = urllib3.PoolManager()
15
root_dir = Path(os.path.realpath(__file__)).parent.parent
16
17
18
def get_chrome_milestone():
19
"""This is the same method from pinned_browser. Use --chrome_channel=Beta if
20
using early stable release."""
21
parser = argparse.ArgumentParser()
22
parser.add_argument(
23
"--chrome_channel", default="Stable", help="Set the Chrome channel"
24
)
25
args = parser.parse_args()
26
channel = args.chrome_channel
27
28
r = http.request(
29
"GET",
30
f"https://chromiumdash.appspot.com/fetch_releases?channel={channel}&num=1&platform=Mac,Linux",
31
)
32
all_versions = json.loads(r.data)
33
# use the same milestone for all Chrome releases, so pick the lowest
34
milestone = min(
35
[version["milestone"] for version in all_versions if version["milestone"]]
36
)
37
r = http.request(
38
"GET",
39
"https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json",
40
)
41
versions = json.loads(r.data)["versions"]
42
43
return sorted(
44
filter(lambda v: v["version"].split(".")[0] == str(milestone), versions),
45
key=lambda v: parse(v["version"]),
46
)[-1]
47
48
49
def fetch_and_save(url, file_path):
50
response = http.request("GET", url)
51
with open(file_path, "wb") as file:
52
file.write(response.data)
53
54
55
def new_chrome(chrome_milestone):
56
return chrome_milestone["version"].split(".")[0]
57
58
59
def previous_chrome(chrome_milestone):
60
return str(int(new_chrome(chrome_milestone)) - 1)
61
62
63
def old_chrome(chrome_milestone):
64
return str(int(new_chrome(chrome_milestone)) - 3)
65
66
67
def add_pdls(chrome_milestone):
68
source_dir = (
69
root_dir / f"common/devtools/chromium/v{previous_chrome(chrome_milestone)}"
70
)
71
target_dir = root_dir / f"common/devtools/chromium/v{new_chrome(chrome_milestone)}"
72
old_dir = root_dir / f"common/devtools/chromium/v{old_chrome(chrome_milestone)}"
73
74
if os.path.isdir(old_dir):
75
shutil.rmtree(old_dir)
76
77
if not target_dir.is_dir() or not any(target_dir.iterdir()):
78
os.makedirs(target_dir, exist_ok=True)
79
if os.path.isdir(source_dir):
80
shutil.copytree(source_dir, target_dir, dirs_exist_ok=True)
81
82
fetch_and_save(
83
f"https://raw.githubusercontent.com/chromium/chromium/{chrome_milestone['version']}/third_party/blink/public/devtools_protocol/browser_protocol.pdl",
84
f"{target_dir}/browser_protocol.pdl",
85
)
86
87
deps_content = http.request(
88
"GET",
89
f"https://raw.githubusercontent.com/chromium/chromium/{chrome_milestone['version']}/DEPS",
90
).data.decode("utf-8")
91
v8_revision = (
92
[line for line in deps_content.split("\n") if "v8_revision" in line][0]
93
.split(": ")[1]
94
.strip("',")
95
)
96
fetch_and_save(
97
f"https://raw.githubusercontent.com/v8/v8/{v8_revision}/include/js_protocol.pdl",
98
f"{target_dir}/js_protocol.pdl",
99
)
100
101
# javadocs does not like script tags
102
with open(f"{target_dir}/browser_protocol.pdl", "r+") as file:
103
script_replace = file.read().replace("`<script>`", "`script`")
104
file.seek(0)
105
file.write(script_replace)
106
file.truncate()
107
108
subprocess.run(["git", "add", str(target_dir / "*")], cwd=root_dir)
109
110
111
def create_new_chrome_files(src_base, chrome_milestone):
112
"""Java and .NET need to copy previous version directory into new version
113
directory."""
114
source_dir = root_dir / f"{src_base}/v{previous_chrome(chrome_milestone)}"
115
target_dir = root_dir / f"{src_base}/v{new_chrome(chrome_milestone)}"
116
old_dir = root_dir / f"{src_base}/v{old_chrome(chrome_milestone)}"
117
118
if old_dir.is_dir():
119
shutil.rmtree(old_dir)
120
121
if source_dir.is_dir() and any(source_dir.iterdir()):
122
os.makedirs(target_dir, exist_ok=True)
123
for item in source_dir.iterdir():
124
shutil.copy(item, target_dir)
125
126
for file in target_dir.iterdir():
127
replace_in_file(
128
file, previous_chrome(chrome_milestone), new_chrome(chrome_milestone)
129
)
130
new_filename = file.name.replace(
131
previous_chrome(chrome_milestone), new_chrome(chrome_milestone)
132
)
133
file.rename(target_dir / new_filename)
134
135
subprocess.run(["git", "add", str(target_dir / "*")], cwd=root_dir)
136
137
138
def replace_in_file(file_path, old_string, new_string, is_regex=False):
139
with open(file_path, "r+") as file:
140
if not is_regex:
141
old_string = re.escape(old_string)
142
data = re.sub(old_string, new_string, file.read())
143
file.seek(0)
144
file.write(data)
145
file.truncate()
146
147
148
def update_java(chrome_milestone):
149
create_new_chrome_files("java/src/org/openqa/selenium/devtools", chrome_milestone)
150
151
files = [
152
root_dir / "java/src/org/openqa/selenium/devtools/versions.bzl",
153
root_dir / "Rakefile",
154
]
155
for file in files:
156
replace_in_file(
157
file, old_chrome(chrome_milestone), new_chrome(chrome_milestone)
158
)
159
160
161
def update_dotnet(chrome_milestone):
162
create_new_chrome_files("dotnet/src/webdriver/DevTools", chrome_milestone)
163
164
files = [
165
root_dir / "dotnet/selenium-dotnet-version.bzl",
166
root_dir / "dotnet/src/webdriver/Selenium.WebDriver.csproj",
167
root_dir / "dotnet/src/webdriver/DevTools/DevToolsDomains.cs",
168
]
169
for file in files:
170
replace_in_file(
171
file, old_chrome(chrome_milestone), new_chrome(chrome_milestone)
172
)
173
174
files = [
175
root_dir / "dotnet/test/common/CustomDriverConfigs/StableChannelChromeDriver.cs"
176
]
177
dir_path = root_dir / "dotnet/test/common/DevTools"
178
files.extend(str(file) for file in dir_path.glob("*") if file.is_file())
179
for file in files:
180
replace_in_file(
181
file, previous_chrome(chrome_milestone), new_chrome(chrome_milestone)
182
)
183
184
185
def update_ruby(chrome_milestone):
186
file = root_dir / "rb/lib/selenium/devtools/BUILD.bazel"
187
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
188
189
file = root_dir / "rb/lib/selenium/devtools/version.rb"
190
replace_in_file(
191
file,
192
rf"{previous_chrome(chrome_milestone)}\.[0-9]*",
193
f"{new_chrome(chrome_milestone)}.0",
194
True,
195
)
196
197
subprocess.run(["bundle", "install"], cwd=root_dir / "rb", check=True)
198
199
200
def update_python(chrome_milestone):
201
file = root_dir / "py/BUILD.bazel"
202
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
203
204
205
def update_js(chrome_milestone):
206
file = root_dir / "javascript/selenium-webdriver/BUILD.bazel"
207
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
208
209
210
if __name__ == "__main__":
211
chrome_milestone = get_chrome_milestone()
212
add_pdls(chrome_milestone)
213
update_java(chrome_milestone)
214
update_dotnet(chrome_milestone)
215
update_ruby(chrome_milestone)
216
update_python(chrome_milestone)
217
update_js(chrome_milestone)
218
219
print(
220
f"adding CDP {new_chrome(chrome_milestone)} and removing {old_chrome(chrome_milestone)}"
221
)
222
223