Phantomjs через selenium в python

#python #selenium #phantomjs

#python #selenium #phantomjs

Вопрос:

Я пытаюсь протестировать поведение веб-страницы на запросы от разных рефереров. Пока я делаю следующее

 webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.referer'] = referer
  

Проблема в том, что на веб-странице есть запросы ajax, которые изменят некоторые вещи в html, и эти запросы ajax должны ссылаться на саму веб-страницу, а не на ссылку, которую я дал в начале. Кажется, что реферер устанавливается один раз в начале, и каждый последующий запрос, будь то ajax или image или anchor, принимает тот же реферер, и он никогда не меняется независимо от того, насколько глубоко вы просматриваете, есть ли решение для выбора реферера только для первого запроса и динамического для остальных?

После некоторого поиска я нашел это и попытался достичь этого с помощью selenium, но у меня пока не было никакого успеха с этим:

 webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.onInitialized'] = """function() {page.customHeaders = {};};"""
  

Есть идеи?

Комментарии:

1. Как успехи, Эван? У меня такая же проблема.

2. @norbertpy Привет, извините за задержку. Нет, я не справлялся с этим через python, насколько я помню. Мне пришлось создать js-скрипт, и при инициировании запроса с помощью установленного реферера я использовал событие под названием «oncomplete» (или что-то подобное), чтобы сбросить реферер в пустую строку, и это сработало. Если вам нужны реальные сценарии, дайте мне знать.

3. @norbertpy Приведенный ниже ответ пришел слишком поздно для меня, но, похоже, это сработает. Вы можете попробовать это, если хотите сохранить все (иш) в python.

Ответ №1:

Из того, что я могу сказать, вам нужно будет исправить PhantomJS для достижения этой цели.

PhantomJS содержит модуль под названием GhostDriver, который предоставляет HTTP API, который WebDriver использует для связи с экземпляром PhantomJS. Итак, все, что вы хотите сделать с помощью 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 модуля.