Javascript 使用开发人员控制台在另一个 Chrome 选项卡中执行 click()
Javascript performing click() in another Chrome tab using developer console
我正在使用 Google Chrome 开发控制台来执行此脚本:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function checkbtn(btn) {
if (btn.singleNodeValue != null) {
console.log('Success!')
btn.singleNodeValue.click();
throw new Error();
} else {
console.log('button not here yet - next button');
};
}
function check() {
url = window.location.href;
var newwindow = window.open(url, 'tab2');
//sleep 250ms
await sleep(250);
var newwindow2 = window.open(url, 'tab3');
//sleep 250ms
await sleep(250);
var newwindow3 = window.open(url, 'tab4');
var loginbtn;
while (true) {
loginbtn = newwindow.document.evaluate("//*[text()='5544']/../../td[@class='action']/form/input[@type='submit' and not(@disabled)]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log('trying button 1');
checkbtn(loginbtn);
loginbtn = newwindow2.document.evaluate("//*[text()='5544']/../../td[@class='action']/form/input[@type='submit' and not(@disabled)]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log('trying button 2');
checkbtn(loginbtn);
loginbtn = newwindow3.document.evaluate("//*[text()='5544']/../../td[@class='action']/form/input[@type='submit' and not(@disabled)]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log('trying button 3');
checkbtn(loginbtn);
};
};
但是,除了在当前活动的选项卡中执行单击之外,这什么也不会导致,在该控制台中我 post 代码。有没有办法让点击发生在例如第三个选项卡还是出于安全原因这是不可能的?
编辑:
至于重复原因:Call a javascript function across browser tabs:
给定的 post 没有说明代码是否来自浏览器控制台的 运行。我想知道是否有任何方法可以操纵另一个选项卡(本地)来单击按钮。
另外:如果不可能:是否可以扩展?
这可以使用浏览器扩展程序。您可以在所有选项卡中注入一个内容脚本文件来操作 DOM 和一个后台脚本来查询所需的选项卡。
此选项需要在后台查询选项卡,然后将消息发送到内容脚本以执行 JS 代码。
或者您可以使用 chrome.tabs.query
和 chrome.tabs.executeScript
,它们仅在后台上下文中可用,因此您不需要使用内容脚本作为注入文件。
我使用一个扩展来完成它,该扩展将函数 checkbtn() 添加到新选项卡。然后我使用
通过控制台调用它
newwindow.checkbtn(args)
然而,这似乎有点太复杂了,因为我不需要通过像 Selenium 这样的第三方库来处理调用,这似乎有点矫枉过正,因此,我正在努力制作扩展正在执行整个脚本。
我正在使用 Google Chrome 开发控制台来执行此脚本:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function checkbtn(btn) {
if (btn.singleNodeValue != null) {
console.log('Success!')
btn.singleNodeValue.click();
throw new Error();
} else {
console.log('button not here yet - next button');
};
}
function check() {
url = window.location.href;
var newwindow = window.open(url, 'tab2');
//sleep 250ms
await sleep(250);
var newwindow2 = window.open(url, 'tab3');
//sleep 250ms
await sleep(250);
var newwindow3 = window.open(url, 'tab4');
var loginbtn;
while (true) {
loginbtn = newwindow.document.evaluate("//*[text()='5544']/../../td[@class='action']/form/input[@type='submit' and not(@disabled)]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log('trying button 1');
checkbtn(loginbtn);
loginbtn = newwindow2.document.evaluate("//*[text()='5544']/../../td[@class='action']/form/input[@type='submit' and not(@disabled)]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log('trying button 2');
checkbtn(loginbtn);
loginbtn = newwindow3.document.evaluate("//*[text()='5544']/../../td[@class='action']/form/input[@type='submit' and not(@disabled)]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log('trying button 3');
checkbtn(loginbtn);
};
};
但是,除了在当前活动的选项卡中执行单击之外,这什么也不会导致,在该控制台中我 post 代码。有没有办法让点击发生在例如第三个选项卡还是出于安全原因这是不可能的?
编辑: 至于重复原因:Call a javascript function across browser tabs: 给定的 post 没有说明代码是否来自浏览器控制台的 运行。我想知道是否有任何方法可以操纵另一个选项卡(本地)来单击按钮。 另外:如果不可能:是否可以扩展?
这可以使用浏览器扩展程序。您可以在所有选项卡中注入一个内容脚本文件来操作 DOM 和一个后台脚本来查询所需的选项卡。 此选项需要在后台查询选项卡,然后将消息发送到内容脚本以执行 JS 代码。
或者您可以使用 chrome.tabs.query
和 chrome.tabs.executeScript
,它们仅在后台上下文中可用,因此您不需要使用内容脚本作为注入文件。
我使用一个扩展来完成它,该扩展将函数 checkbtn() 添加到新选项卡。然后我使用
通过控制台调用它newwindow.checkbtn(args)
然而,这似乎有点太复杂了,因为我不需要通过像 Selenium 这样的第三方库来处理调用,这似乎有点矫枉过正,因此,我正在努力制作扩展正在执行整个脚本。