我的目标是通过Python在Selenium上使用Adblock Plus。我已经能够让它加载扩展,但默认情况下,它不包括默认过滤器 "EasyList"。这是我目前的成果。
from selenium import webdriver
from time import sleep
ffprofile = webdriver.FirefoxProfile()
adblockfile = '/Users/username/Downloads/adblock_plus-2.4-tb+fx+an+sm.xpi'
ffprofile.add_extension(adblockfile)
ffprofile.set_preference("extensions.adblockplus.currentVersion", "2.4")
browser = webdriver.Firefox(ffprofile)
while(True):
browser.get("www.cnn.com")
sleep(5)
大部分的代码都是抄袭自 http:/selenium-python.readthedocs.orgenlatestfaq.html。
事实上,Adblock Plus默认会添加EasyList - 但如果你设置了 extensions.adblockplus.currentVersion
的偏好来禁用updatefirst-run动作。我猜你的目标是防止首次运行的页面出现,但也防止了数据存储初始化。请注意,你这里的问题比较多:即使Adblock Plus添加了EasyList,它的下载时间还是未知的。
更好的做法应该是用现有的初始化你的资料 adblockplus/patterns.ini
文件。您可以从您的常规Firefox配置文件中获取这个文件,并进行EasyList和其他过滤设置,然后将其复制到 /Users/username/Downloads/profilemodel/adblockplus/patterns.ini
. 那么下面的方法应该可以。
ffprofile = webdriver.FirefoxProfile("/Users/username/Downloads/profilemodel");
有一个更好的方法:
1) 用7-zip或类似的文件解压adblock.xpi。
2)用普通文本编辑器打开modulesAppIntegration.jsm。
3) 找到 "notifyUser() "的函数声明,用一个简单的回车来代替它。
/**
* function notifyUser()
* {
* let wrapper = (wrappers.length ? wrappers[0] : null);
* if (wrapper && wrapper.addTab)
* {
* wrapper.addTab("chrome://adblockplus/content/ui/firstRun.xul");
* }
* else
* {
* Utils.windowWatcher.openWindow(wrapper ? wrapper.window : null,
* "chrome://adblockplus/content/ui/firstRun.xul",
* "_blank", "chrome,centerscreen,resizable,dialog=no", null);
* }
* }
*/
function notifyUser()
{
return;
}
现在你只需要把文件打包成一个zip文件 然后把扩展名从.zip改成.xpi -- 瞧!
这将阻止adblock加载欢迎页面,但它仍然会配置必要的订阅设置。 请确保 不 呼叫
ffprofile.set_preference("extensions.adblockplus.currentVersion", "x.x.x")
否则,它将不知道要 "自我启动"
请注意,这是针对adblock_plus-2.0.3的,因为我使用的是firefox-17。新版本的代码可能会略有不同,并且在不同的位置。请看 https:/issues.adblockplus.orgticket206#comment:5
我最近才通过试错找到了如何屏蔽首发页面而不出现任何问题。
进入你的扩展名所在的文件夹
在 lib/adblockplus.js
,设置 defaults.suppress_first_run_page
到 true
而不是 false
.