Невидимые вкладки в расширении Chrome

Я в основном хочу автоматизировать сайт с помощью расширения Chrome. Но на этом веб-сайте очень много клиентского кода, поэтому очень сложно определить, какой запрос мне нужно сделать, чтобы получить необходимую информацию.

Самым простым способом, который я могу придумать, было бы использование сценария содержимого для ввода текста в элементы ввода и нажатия кнопок, например, (в данном случае с jQuery):

$.ready(function(){
  $("#input").val("foo");
  $("#submit").click();
});

Очень похоже на этот вопрос:Внедрение ввода во вкладку, открытую расширением Chrome, но взаимодействие с этим сайтом не должно быть видно.

Итак: Могу ли я открыть страницы в Chrome из расширения, которые не видны пользователю, и использовать их для взаимодействия с веб-сайтами?

Ответы на вопрос(2)

Увидетьtabs.createВы можете вызвать следующий код, создав невидимую вкладку (не активную).

chrome.tabs.create({ url: 'https://www.google.com', active: false, });
 EssenceBlue17 апр. 2019 г., 22:11
Используйте chrome.windows.create с «popup», и у вас будет безголовый браузер.
 Pete01 июн. 2016 г., 12:28
Это все еще видимая вкладка.
 Pete01 июн. 2016 г., 12:29
То, что я хотел бы сделать, обычно можно сделать с помощью браузера без головы, но не в расширении Chrome.
Решение Вопроса

Если вы хотите, чтобы страница была полностью невидимой, я считаю, что единственный вариант - загрузить ее в iframe на фоновой странице. После этого вы можете получить доступ к странице внутри iframe, используя скрипты содержимого, так же, как и обычную видимую страницу.

Поскольку многие сайты ограничивают встраивание с помощьюX-Frame-Options заголовок, вам, вероятно, придется использовать API webRequest для удаления этого заголовка перед загрузкой страницы в iframe. Некоторые страницы также используют другие методы для предотвращения встраивания, которые могут еще больше усложнить это.

Пример кода:

manifest.json

{
  "manifest_version": 2,
  "name": "Hidden page in background",
  "description": "Interact with a hidden page in background",
  "version": "1.0",

  "background": {
    "page": "background.html",
    "persistent": true
  },
  "content_scripts": [
    {
      "matches": ["*://*.google.fr/*"],
      "js": ["contentscript.js"],
      "all_frames": true
    }
  ],
  "permissions": ["*://*.google.fr/*", "webRequest", "webRequestBlocking"]
}

background.html

<!DOCTYPE html>
<html>
  <head>
    <script src="background.js"></script>
  </head>
  <body>
    <iframe id="iframe1" width="1000 px" height="600 px" src="http://www.google.fr"></iframe>
  </body>
</html>

background.js

// This is to remove X-Frame-Options header, if present
chrome.webRequest.onHeadersReceived.addListener(
    function(info) {
      var headers = info.responseHeaders;
      var index = headers.findIndex(x=>x.name.toLowerCase() == "x-frame-options");
      if (index !=-1) {
        headers.splice(index, 1);
      }
      return {responseHeaders: headers};
    },
    {
        urls: ['*://*.google.fr/*'], //
        types: ['sub_frame']
    },
    ['blocking', 'responseHeaders']
);

contentscript.js

var elementToInsert = document.createElement("h1");
elementToInsert.textContent = "This text comes from my content script.";
document.body.insertBefore(elementToInsert, document.body.firstChild);

Пара заметок:

УдалениеX-Frame-Options заголовок не ограничен фоновой страницей здесь. Это позволило бы встраивать соответствующую страницу в фреймы на любую другую страницу. К сожалению, Chrome не поддерживаетALLOW-FROM uri значение, которое можно использовать для ограничения встраивания только вашим расширением.Сценарий содержимого внедряется на все страницы здесь. Вы можете вставить его программно только в iframe на фоновой странице, но это немного сложнее.я использовалwww.google.fr в качестве примера, потому что он используетX-Frame-Options, но не использует никаких других методов для предотвращения встраивания. Я использовал французский домен, потому чтоgoogle.com имеет тенденцию перенаправлять на локальные домены уровня страны автоматически.
 Pete01 июн. 2016 г., 14:20
Это именно то, что я искал. В моем случае мне даже не нужно удалять заголовок X-Frame-Options.

Ваш ответ на вопрос