在Python中通过Selenium使用PhantomJS
我正在尝试测试一个网页在不同来源(referrer)请求下的表现。目前我做了以下操作:
webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.referer'] = referer
问题是这个网页有一些ajax请求,这些请求会改变网页上的一些内容,而这些ajax请求的来源应该是网页本身,而不是我一开始设置的来源。看起来来源在一开始就被设定了,之后无论是ajax请求、图片请求还是链接请求,都会使用同样的来源,而且无论你浏览得多深入,这个来源都不会改变。有没有办法让第一次请求的来源是我设置的,而后面的请求来源可以动态变化呢?
我搜索了一下,发现了这个链接,我尝试通过selenium来实现,但到目前为止还没有成功:
webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.onInitialized'] = """function() {page.customHeaders = {};};"""
有什么想法吗?
1 个回答
2
根据我的了解,你需要对PhantomJS进行一些修改才能实现这个功能。
PhantomJS里面有一个叫GhostDriver的模块,它提供了WebDriver用来和PhantomJS实例沟通的HTTP接口。所以你想通过WebDriver做的任何事情,都得是GhostDriver支持的,但看起来onInitialized
并不在GhostDriver的支持范围内。
如果你想尝试一下,可以去克隆一下PhantomJS的代码库,然后修改src/ghostdriver/session.js这个文件,来实现你想要的功能。
_init
方法的样子是这样的:
_init = function() {
var page;
// Ensure a Current Window is available, if it's found to be `null`
if (_currentWindowHandle === null) {
// Create the first Window/Page
page = require("webpage").create();
// Decorate it with listeners and helpers
page = _decorateNewWindow(page);
// set session-specific CookieJar
page.cookieJar = _cookieJar;
// Make the new Window, the Current Window
_currentWindowHandle = page.windowHandle;
// Store by WindowHandle
_windows[_currentWindowHandle] = page;
}
},
你可以试着使用你找到的代码:
page.onInitialized = function() {
page.customHeaders = {};
};
在那里的page
对象上。
不过根据你测试的内容,你可能可以省去很多麻烦,直接测试HTTP请求,而不需要使用浏览器,可以用像requests
这样的模块。