#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
модуля.