chrome插件重打包目前发现两种方案,一种是用selenium模拟鼠标操作重打包,一种是使用chrome运行参数重打包
方法一、使用chrome.exe重打包
进入chrome目录下,一般在C:\Program Files\Google\Chrome\Application
目录下,使用以下命令重打包
chrome.exe --pack-extension=C:\extension --pack-extension-key=C:\extension.pem
--pack-extension=
插件文件夹路径,打包以后的crx会放在插件文件夹路径同级目录下--pack-extension-key=
插件密钥路径,可以为空,会自动在插件文件夹路径同级目录下生成一个密钥
方法二、使用selenium对chrome插件进行自动重打包
chrome插件的拓展程序页使用Shadow DOM(影子DOM)和Shadow Root(影子根)
无法用常规selenium手段获取页面dom元素进行操作,因此使用execute_script的形式执行js操作元素
使用time.sleep(3)目的是为了方便调试时看清操作,实际使用可以酌情删除
import time
from selenium import webdriver
def main():
driver = webdriver.Chrome()
try:
driver.get("chrome://extensions/")
driver.implicitly_wait(10)
time.sleep(3)
# 执行 JavaScript 代码来获取 shadow DOM 中的内容
# 开启开发者模式
driver.execute_script('''
var toggle = document.querySelector('extensions-manager').shadowRoot
.querySelector('extensions-toolbar').shadowRoot
.querySelector('cr-toolbar').querySelector('cr-toggle');
toggle.click();
''')
time.sleep(3)
# 点击打包按钮
driver.execute_script('''
var button = document.querySelector('extensions-manager').shadowRoot
.querySelector('extensions-toolbar').shadowRoot
.querySelector('cr-button[id="packExtensions"]');
button.click();
''')
time.sleep(3)
dialog_code = '''
var dialog = document.querySelector('extensions-manager').shadowRoot
.querySelector('extensions-toolbar').shadowRoot
.querySelector('extensions-pack-dialog').shadowRoot
.querySelector('cr-dialog').shadowRoot;
'''
# 输入路径
path = r"此处是插件路径"
driver.execute_script(f'''
{dialog_code}
var body = dialog.querySelector('slot[name="body"]').assignedElements()[0];
var crInput = body.querySelector('cr-input#rootDir').shadowRoot;
var input = crInput.querySelector('input#input')
input.value = arguments[0];
input.dispatchEvent(new Event('input', {{ bubbles: true }}));
''', path)
time.sleep(3)
# 点击打包按钮
driver.execute_script(f'''
{dialog_code}
var container = dialog.querySelector('slot[name="button-container"]').assignedElements()[0];
var action = container.querySelector('cr-button.action-button').shadowRoot;
var button = action.querySelector('#content');
button.click();
''')
time.sleep(3)
except Exception as e:
print(f"Error getting: {e}")
driver.save_screenshot("screenshot/error.png")
finally:
driver.quit()
if __name__ == '__main__':
main()