我遵循了本主题Selenium using Python: enter/provide http proxy password for firefox上提供的@Mike解决方案 并且非常适合通过插件解决Chrome上的代理身份验证问题。
现在,我在Firefox浏览器中面临着同样的问题:我使用Java,使用Selenium,并且我试图创建一个扩展名(将其打包到.xpi中),将完成相同的工作。
所以我现在在我的代码中正在做的事情如下:
**manifest.json
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Firefox Proxy | (Proxy Connector)",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
}
}
**background.js
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "https",
host: "%proxy_host",
port: parseInt("%proxy_port")
},
bypassList: []
}
};
firefox.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%username",
password: "%password"
}
};
}
firefox.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
-创建一个.zip文件,但将其命名为.xpi I read somewhere that should work, but i'm not too sure
try {
FileOutputStream fos = new FileOutputStream("./src/temp/plugin.xpi");
ZipOutputStream zipOS = new ZipOutputStream(fos);
writeToZipFile(manifestTemp.toString(), zipOS);
writeToZipFile(scriptModified.toString(), zipOS);
zipOS.close();
fos.close();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
private void writeToZipFile(String path, ZipOutputStream zipOS) throws IOException {
File aFile = new File(path);
FileInputStream fis = new FileInputStream(aFile);
ZipEntry zipEntry = new ZipEntry(aFile.getName());
zipOS.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOS.write(bytes, 0, length);
}
zipOS.closeEntry();
fis.close();
}
-设置Firefox配置文件,添加扩展名并运行webdriver:
File extension = new File("./src/temp/plugin.xpi");
System.setProperty("webdriver.gecko.driver", "./src/WebDriver/geckodriver.exe");
FirefoxProfile profile = new FirefoxProfile();
profile.addExtension(extension);
profile.setPreference("extensions.firebug.onByDefault", true);
profile.setPreference("xpinstall.signatures.required", false);
FirefoxOptions options = new FirefoxOptions();
options.setBinary(new FirefoxBinary()); //don't know if this is correct
options.setProfile(profile);
this.driver = new FirefoxDriver(options);
运行所有这些命令后,以下错误代码出现在驱动程序声明行:
Exception in thread "AWT-EventQueue-0" org.openqa.selenium.firefox.UnableToCreateProfileException: java.io.FileNotFoundException: ...%user%\AppData\Local\Temp\anonymous1577938325377124354webdriver-profile\extensions\FirefoxProxy|(ProxyConnector)@1.0.0.xpi (The syntax of the file name, directory or volume is incorrect)
Build info: version: '3.141.59'
//geckodriver version '0.24.0'
我还尝试了在调试模式下在Firefox上手动添加扩展名,以便Firefox在没有签名的情况下也不会拒绝它,但是它没有用。看来它可以识别插件,但没有应用。
我对.xpi格式有疑问,我在某处读取的.rdf文件应该放在.xpi中,并且应该提供有关插件安装的说明,但是我不太了解。
感谢您的支持:)
编辑: 顺便说一句,我并没有被迫使用该插件,我想要获得的最终结果是使用不同的数据进行自动代理身份验证,然后让用户自由浏览。我已经在寻找一个不太复杂的解决方案,但是找到了。
EDIT2:
我解决了问题。这不是我的代码,除非您使用开发人员的Firefox版本并将配置文件首选项xpinstall.signatures.required
设置为false
,否则Firefox浏览器将不再接受未签名的扩展名。
答案 0 :(得分:0)
ld
我已通过更改manifest.json中指定的附件名称来解决此问题,因为Windows文件不允许(和|。
但是我似乎还有另一个错误: Firefox无法安装该插件,因为它说它已损坏。 在Firefox中调试时,出现问题
(The syntax of the file name, directory or volume is incorrect)
因为它在firefox上获得了参考错误,因为它之前没有初始化。 你为它工作了吗?