我如何在Python中使用Selenium读取我的Safari Web扩展的本地存储?



使用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

相关内容

  • 没有找到相关文章

最新更新