Например, во время отладки в редакторе скриптов в какой-то момент я решаю сохранить используемый в данный момент временный профиль и использую для этого действие brower settings с указанием filepath, куда он должен быть сохранен.
BAS сохраняет профиль и переключается на вновь созданный локальный профиль. Таким образом, я хочу продолжить отладку, но теперь неясно, какие настройки были очищены, а какие остались активными (например, прокси-сервер по-прежнему установлен, хотя в журнале сообщается, что он исчез, но заголовки, установленные вручную, очищены).
Также есть много других настроек, таких как расширение браузера, командная строка, версия браузера... где неясно, были ли они очищены или все еще активны.
Сделать возможность подмены запроса на свою функцию
-
Недавно в модуль "Сеть" добавили экшены для замены запросов. Но бывают ситуации, когда тело запроса недостаточно менять просто по фильтрам. Например, содержимое закодировано в base64, в котором лежит json, часть значений которого генерируется сайтом (идентификаторы, таймстампы). Поэтому нужна возможность добавить функцию, типа:
function(request){}, где request - объект запроса.Я сейчас пытаюсь подменять через экшен "Выполнять при каждой загрузке страницы в браузере", типа такого:
(function() { const TARGET_PATTERN = 'myurl'; const originalFetch = window.fetch; window.fetch = function(input, init) { const url = new URL( typeof input === 'string' ? input : input.url, location.href ); if (url.pathname.endsWith(TARGET_PATTERN)) { setFptImageParams(url.searchParams); input = url.toString(); } return originalFetch(input, init); }; const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { const parsedUrl = new URL(url, location.href); if (parsedUrl.pathname.endsWith(TARGET_PATTERN)) { makeReplace(parsedUrl.searchParams); url = parsedUrl.toString(); } originalOpen.call(this, method, url); }; function makeReplace(params) { // Моя бизнес логика } })();Но после применения этого кода бас перестает видеть элементы на странице при поиске по селекторам.
-
Я делал множество раз подобное и у меня работало.
Может использовать немного другой подход(код не тестировал никак совсем):
(function() { const TARGET_PATTERN = 'myurl'; // Store original fetch in window object with a unique key if (!window.__originalFetch) { window.__originalFetch = window.fetch; } // Overwrite fetch Object.defineProperty(window, 'fetch', { value: function(input, init) { const url = new URL( typeof input === 'string' ? input : input.url, location.href ); if (url.pathname.endsWith(TARGET_PATTERN)) { setFptImageParams(url.searchParams); input = url.toString(); } return window.__originalFetch(input, init); }, configurable: true // Allows redefining the property later if needed }); // Store original XMLHttpRequest.open if (!window.__originalXHROpen) { window.__originalXHROpen = XMLHttpRequest.prototype.open; } // Overwrite XMLHttpRequest.open Object.defineProperty(XMLHttpRequest.prototype, 'open', { value: function(method, url) { const parsedUrl = new URL(url, location.href); if (parsedUrl.pathname.endsWith(TARGET_PATTERN)) { makeReplace(parsedUrl.searchParams); url = parsedUrl.toString(); } window.__originalXHROpen.call(this, method, url); }, configurable: true }); function makeReplace(params) { // Моя бизнес логика } })(); -
@sergerdn через Object.defineProperty тоже пробовал, не искались элементы. Но попробую твой вариант.
Ну а смысл топика изначально в том, чтобы дать возможность через кубик подмены передавать свою функцию, раз такой функционал есть все равно.