使用Firefox WebDriver,我可以像这样读取扩展的本地存储:
extension_path = "/path/to/my/extension"
info = {
"extension_id": f"foobar",
"uuid": uuid.uuid4(),
}
base_url = f"moz-extension://{info['uuid']}/"
opts = FirefoxOptions()
opts.set_preference('extensions.webextensions.uuids', '{"%s": "%s"}' % (
info["extension_id"], info["uuid"]))
driver = webdriver.Firefox(options=opts)
driver.install_addon(extension_path, temporary=True)
driver.get(f"{base_url}_generated_background_page.html")
results = self.driver.execute_async_script((
"let done = arguments[arguments.length - 1],"
" store_name = arguments[0];"
"browser.storage.local.get([store_name], function (res) {"
" done(res[store_name]);"
"});"
), "foo")
如何在macOS上使用Safari WebDriver ?我已经使用xcrun safari-web-extension-converter /path/to/my/extension
移植了扩展,并构建并手动测试了它在Safari中的工作。在Safari中,我可以去Develop -> Web Extension Background Pages -> <my web extension>
找到扩展的id,并看到生成的背景页面位于safari-web-extension://<id>/_generated_background_page.html
但运行以下结果硒在driver.get(f"{base_url}_generated_background_page.html")
冻结
base_url = f"safari-web-extension://<id>/"
driver = webdriver.Safari()
driver.get(f"{base_url}_generated_background_page.html")
results = self.driver.execute_async_script((
"let done = arguments[arguments.length - 1],"
" store_name = arguments[0];"
"browser.storage.local.get([store_name], function (res) {"
" done(res[store_name]);"
"});"
), "foo")
我能做什么?
2023年2月8日更新
我还尝试了一种使用browser.runtime.sendMessage
的方法,在Python Selenium中我这样做:
results = self.driver.execute_async_script((
"let done = arguments[arguments.length - 1],"
" store_name = arguments[0];"
" browser.runtime.sendMessage('com.oskar.foo.Extension (Apple Team ID)', {}, function (res) {"
" done(res[store_name]);"
" });"
), "foo")
,并在扩展名中添加以下内容:
browser.runtime.onMessageExternal.addListener(function (
request,
sender,
sendResponse
) {
browser.storage.local.get("foo").then((j) => {
sendResponse(j);
});
return true;
});
和manifest.json
"externally_connectable": {
"ids": ["*"],
"matches": ["https://example.org/*"]
}
这样,当运行测试时,我实际上从扩展中获得一个值。但是,它不是从Selenium启动的Safari实例中读取扩展的存储空间,而是从"real"中读取扩展的存储空间。safari实例。
我对这个问题不是很了解。但是,这样的请求;它可能需要提供双工通信,包括传出请求和回调,在这种情况下,由于网络需要,它可能会挂起。
在下面的链接中,事务是通过轮询wait完成的。我认为这种方法可以解决问题。这里还提到了一个bug,请注意。
https://stackoverflow.com/a/28066902/914284