我正在使用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);
};
};
但是,除了在当前活动选项卡中执行单击之外,什么都不会导致,我在控制台中发布了代码。有没有一种方法可以使点击发生在例如第三个标签还是出于安全原因这是不可能的?
编辑: 由于重复原因,https://docs.microsoft.com/en-us/visualstudio/deployment/walkthrough-manually-deploying-a-clickonce-application?view=vs-2017: 给定的帖子并不清楚该代码是否是从浏览器控制台运行的。我想知道是否可以通过任何方式(本地)操作另一个选项卡来单击按钮。 另外:如果不可能:是否可以扩展?
答案 0 :(得分:0)
使用浏览器扩展程序可以做到这一点。您可能在所有选项卡中注入了内容脚本文件来操作DOM,并在后台脚本中查询了所需的选项卡。 此选项需要在后台查询选项卡,然后将消息发送到内容脚本以执行JS代码。
或者您可以使用chrome.tabs.query
和chrome.tabs.executeScript
,它们仅在后台上下文中可用,因此您不需要将内容脚本用作注入文件。
答案 1 :(得分:0)
我使用扩展将功能checkbtn()添加到新标签页来完成此操作。然后,我通过控制台使用
调用它 newwindow.checkbtn(args)
但是,这似乎有点太复杂了,由于我不需要处理像Selenium之类的第三方库的调用,因此这似乎有点过头了,因此,我正在努力制作整个脚本由扩展程序执行。