问题:在黄瓜测试运行期间切换javascript支持而不重启firefox(也不使用不同的驱动程序)。
如果Firefox的prefutils在网页中暴露给javascript,那就可以了。但事实并非如此。
那么,有没有一个插件可以做到这一点?或者还有另一种解决问题的方法吗?或者是否有一个很好的教程(突出显示曝光位)如何制作这样的插件?
修改
再想一想,一旦被禁用,javascript会有什么帮助?可能整个想法有点搞砸。
答案 0 :(得分:3)
我认为您的测试使用正常的Web内容权限运行。在这种情况下,它们无法影响浏览器设置,例如是否启用了JavaScript(我认为这是“切换JavaScript支持”的意思)。
我实现了一个简单的XPCOM组件,其中包含一个打开和关闭JS支持的方法(通过设置适当的pref)。您可以将其公开为JavaScript全局属性,以便您的测试可以访问它。有关详细信息,请参阅Expose an XPCOM component to javascript in a web page。将组件打包到扩展中,并确保它安装在运行测试的Firefox实例中。
如果您想直接从内容脚本访问首选项API,您可以将以下首选项添加到Firefox中,方法是:about:config或将以下行添加到您的个人资料目录中的prefs.js:
user_pref("capability.principal.codebase.p1.granted", "UniversalXPConnect UniversalBrowserRead UniversalBrowserWrite UniversalPreferencesRead UniversalPreferencesWrite UniversalFileRead");
user_pref("capability.principal.codebase.p1.id", "http://www.example.com");
user_pref("capability.principal.codebase.p1.subjectName", "");`
user_pref("signed.applets.codebase_principal_support", true);
将www.example.com替换为您要授予其权限的域。在调用首选项API之前,还要将此行添加到JS代码中:
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
答案 1 :(得分:1)
允许本地文件(从file:///
加载的内容)请求其他权限。通常,您会收到一个提示,询问您是否要允许访问 - 您可以通过在Firefox配置文件中将以下行添加到prefs.js
来“自动接受”提示:
user_pref("capability.principal.codebase.p0.granted", "UniversalXPConnect");
user_pref("capability.principal.codebase.p0.id", "file://");
user_pref("capability.principal.codebase.p0.subjectName", "");
然后您可以执行以下页面:
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var branch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
branch.setBoolPref("javascript.enabled", false);
如果您的网页是本地文件,这肯定会有效。但是,根据错误消息判断,您当前正在运行about:blank
的代码。 可能将capability.principal.codebase.p0.id
更改为about:blank
或更改为moz-safe-about:blank
将允许该页面获得扩展权限,但我不确定。
但是,如果JavaScript已经被禁用并且您需要启用它,那么这些都不会真正有用。这只能通过编写扩展并将其添加到测试配置文件来解决。无论此设置如何,Firefox扩展中的JavaScript都可以使用。
答案 2 :(得分:0)
这意味着你需要使用Javascript来切换启用或禁用Javascript。
function setJavascriptPref(bool) {
prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
prefs.setBoolPref("javascript.enabled", bool);
}