以编程方式切换javascript支持而无需重新启动Firefox

时间:2011-07-07 15:59:37

标签: firefox selenium firefox-addon cucumber capybara

问题:在黄瓜测试运行期间切换javascript支持而不重启firefox(也不使用不同的驱动程序)。

如果Firefox的prefutils在网页中暴露给javascript,那就可以了。但事实并非如此。

那么,有没有一个插件可以做到这一点?或者还有另一种解决问题的方法吗?或者是否有一个很好的教程(突出显示曝光位)如何制作这样的插件?

修改

再想一想,一旦被禁用,javascript会有什么帮助?可能整个想法有点搞砸。

3 个答案:

答案 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);
}