Ответ 1
вопрос
Похоже, вы неправильно понимаете поведение скрипта контента.
Цитирование официальной документации:
Сценарии содержимого - это файлы JavaScript, которые запускаются в контексте веб-страниц. Используя стандартную объектную модель документа (DOM), они могут читать информацию о веб-страницах, которые посещает браузер, или вносить в них изменения.
Таким образом, использование вашего content_script.js
в вашем popup.html
не имеет большого смысла и, очевидно, приводит к ошибке, потому что у вас нет кнопки с class="planet-name"
на вашей странице popup.html
.
Решение
Чтобы сделать то, что вы хотите, вам нужно создать другой скрипт для вашего popup.html
и добавить прослушиватель для этой кнопки, чтобы при нажатии на нее вы могли content_script.js
скрипт content_script.js
на страницу, чтобы нажать "планету" элемент.
Так что вам придется:
- Отредактируйте ваш
manifest.json
удалив поле"content_scripts"
- Создайте файл
popup.js
для добавления на страницуpopup.html
- Добавьте прослушиватель для нажатия кнопки внутри
popup.js
чтобы внедрить файлcontent_script.js
с помощьюchrome.tabs.executeScript()
- Отредактируйте ваш
content_script.js
чтобы он нажимал кнопку прямо на странице
-
Прежде всего, отредактируйте ваш
manifest.json
, он должен выглядеть так:{ "manifest_version": 2, "name": "Such Activity", "description": "Wow", "version": "1.0", "permissions": ["tabs", "<all_urls>"], "browser_action": { "default_icon": "icon.png", "default_popup": "popup.html" } }
-
Затем удалите ваш
content_script.js
изpopup.html
и замените егоpopup.js
:<!doctype html> <html> <head><title>activity</title></head> <body> <button id="clickactivity">click</button> <script src="popup.js"></script> </body> </html>
-
Создайте скрипт
popup.js
и добавьте слушателя к кнопке, которая будет вставлять скрипт на текущую страницу:function injectTheScript() { chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { // query the active tab, which will be only one tab //and inject the script in it chrome.tabs.executeScript(tabs[0].id, {file: "content_script.js"}); }); } document.getElementById('clickactivity').addEventListener('click', injectTheScript);
-
Теперь, в вашем
content_script.js
, вам нужно будет нажать кнопку напрямую, а также вам не нужно будет использоватьDOMContentReady
, потому что Chrome ждет, чтобы внедрить скрипт самостоятельно. Итак, ваш новыйcontent_script.js
будет:function clickPlanet() { var planets = document.getElementsByClassName("planet-name"), randomplanet = Math.floor(Math.random() * planets.length), clickplanet = planets[randomplanet]; clickplanet.click(); } clickPlanet();
Рабочий пример
Скачать рабочий пример расширения можно ЗДЕСЬ.
Документация
Я настоятельно рекомендую вам взглянуть на документацию по методам, использованным в моем примере, чтобы полностью понять их поведение и их свойства, вот несколько ссылок, которые могут оказаться полезными: