在Python中通过Selenium使用PhantomJS

6 投票
1 回答
1400 浏览
提问于 2025-04-18 11:46

我正在尝试测试一个网页在不同来源(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这样的模块。

撰写回答