Osk*_*son 14 javascript python safari selenium safari-web-extension
使用 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")
Run Code Online (Sandbox Code Playgroud)
如何在 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")
Run Code Online (Sandbox Code Playgroud)
我能做些什么?
我还尝试了一种方法,使用browser.runtime.sendMessagePython 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")
Run Code Online (Sandbox Code Playgroud)
并将以下内容添加到扩展中的background.js:
browser.runtime.onMessageExternal.addListener(function (
request,
sender,
sendResponse
) {
browser.storage.local.get("foo").then((j) => {
sendResponse(j);
});
return true;
});
Run Code Online (Sandbox Code Playgroud)
并将其添加到manifest.json
"externally_connectable": {
"ids": ["*"],
"matches": ["https://example.org/*"]
}
Run Code Online (Sandbox Code Playgroud)
这样我在运行测试时实际上从扩展中获取了一个值。但它不是从 Selenium 启动的 Safari 实例中读取扩展的存储,而是从“真实”的 safari 实例中读取扩展的存储。
我对这个问题不是很了解。然而,此类请求;可能是它需要提供双工通信,包括传出请求和回调,在这种情况下,它可能会因网络需要而挂起。
在下面的链接中,事务是通过wait轮询进行的。我觉得这样的做法是可以解决问题的。这里还提到了一个bug,小心它。
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |