Как прослушать изменение URL с помощью расширения Chrome
Я пишу расширение Google Chrome для автоматизации некоторых общих задач. Я хочу использовать следующие функции:
- Создайте новую вкладку и перейдите к моей веб-почте
- введите имя пользователя и пароль
- нажмите кнопку "отправить"
- Подождите, пока появится страница веб-почты, и выберите клиент "roundcube".
Я выполнил шаги 1,2 и 3, и они работают. У меня возникли проблемы с попыткой прослушать изменение URL-адреса после отправки моих учетных данных, чтобы функция, которая выбирает клиента roundcube, может запускаться
Я знаю, что могу запускать скрипт, когда страница выбора клиента появляется, добавляя к моему манифесту, но вместо этого я хочу использовать "chrome.tabs.executeScript", чтобы roundcube был выбран, только если я запустил скрипт из расширения chrome, а не если я пойду на страницу выбора клиента вручную.
Вот мой manifest.json:
{
"manifest_version": 2,
"name" : "Chrome Autobot",
"description": "This extension will run various automation scripts for google chrome",
"version" : "1.0",
"browser_action" : {
"default_icon" : "icon.png",
"default_popup": "index.html"
},
"permissions": [
"activeTab",
"webNavigation",
"tabs",
"http://*/*",
"https://*/*"
]
}
Вот мой хром-скрипт:
jQuery(function($) {
"Use Strict";
var openWebmail = function() {
chrome.tabs.create({
url: 'http://mywebmaillogin.com:2095/'
}, function() {
chrome.tabs.executeScript(null, {file: "scripts/openEmail.js"});
});
chrome.tabs.onUpdated.addListener(function(){
chrome.tabs.executeScript(null, {file: "scripts/openEmail.js"});
alert('i work');
});
};
var init = $('.script-init');
init.on('click', function() {
openWebmail();
});
});
и здесь сценарий содержимого должен быть выполнен как обратный вызов создания табуляции (когда загружается страница входа в систему электронной почты и загружается DOM), а также после отправки учетных данных электронной почты и загрузки страницы выбора DOM (которая не является работая сейчас)
var openEmail = function() {
var loc = window.location.href;
if(loc === 'http://mywebmaillogin.com:2095/') {
var submit = document.getElementById('login_submit');
user.value = 'myusername';
pass.value = 'mypassword';
if(user.value === 'myusername' && pass.value === 'mypassword') {
submit.click();
}
else {
openEmail();
}
}
if(loc.indexOf('http://mywebmaillogin:2095/') > -1 && loc.indexOf('login=1') > -1) {
alert('I work');
}
}()
любая помощь будет оценена... спасибо!
Ответы
Ответ 1
используйте chrome.tabs.onUpdated
Maifest.json
{
"name": "My test extension",
"version": "1",
"manifest_version": 2,
"background": {
"scripts":["background.js"]
},
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["contentscript.js"]
}
],
"permissions": [
"tabs"
]
}
contentscript.js
chrome.tabs.onUpdated.addListener(
function(tabId, changeInfo, tab) {
window.console.log('updated from contentscript');
}
);
background.js
chrome.tabs.onUpdated.addListener(function() {
alert('updated from background');
});
Ответ 2
Как упоминалось в NycCompSci, вы не можете вызвать chrome api из сценариев контента. Я смог передать данные api в скрипты содержания с передачей сообщений, поэтому подумал, что я поделюсь этим здесь. Первый вызов onUpdated
в background.js:
манифест
{
"name": "My test extension",
"version": "1",
"manifest_version": 2,
"background": {
"scripts":["background.js"]
},
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["contentscript.js"]
}
],
"permissions": [
"tabs"
]
}
background.js
chrome.tabs.onUpdated.addListener(function
(tabId, changeInfo, tab) {
// read changeInfo data and do something with it (like read the url)
if (changeInfo.url) {
// do something here
}
}
);
Затем вы можете развернуть этот скрипт для отправки данных (включая новый url и другие chrome.tabs.onUpdated info) из background.js в ваш скрипт контента следующим образом:
background.js
chrome.tabs.onUpdated.addListener(
function(tabId, changeInfo, tab) {
// read changeInfo data and do something with it
// like send the new url to contentscripts.js
if (changeInfo.url) {
chrome.tabs.sendMessage( tabId, {
message: 'hello!',
url: changeInfo.url
})
}
}
);
Теперь вам просто нужно прослушать эти данные в вашем сценарии содержимого:
contentscript.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
// listen for messages sent from background.js
if (request.message === 'hello!') {
console.log(request.url) // new url is now in content scripts!
}
});
Надеюсь, что кто-то поможет! ʘ‿ʘ