以下操作无效:
window.open(‘javascript:{do something here}’)
一些安全错误,并在此处要求输入不安全的内联关键字输入代码
我需要打开一个新窗口并导航到url并找到一个按钮,然后单击它。
我所拥有的都是网址(数百个网址),我正在循环使用每个网址的Promise。问题是脚本无法正常工作,因为单击链接后页面已重新加载。因此,需要在新选项卡中打开它,然后在打开链接时运行脚本(单击按钮即可下载)。
var lk=[
{
"key": "www.someurl.com",
"value": "somefile"
},
{
"key": "someurl",
"value": "somefilename"
}];
p=Promise.resolve();
for(i=0;i<lk.length;i++){
p=p.then(new Promise(_=>{
var link = document.createElement("a");
link.download = lk[i].value;
link.href = lk[i].key;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
delete link;
setTimeout(()=>{
_();
},30000);
}));
console.log('Completed '+i);
}
在Chrome控制台的link.click()上重新加载页面后,上述脚本停止工作
我尝试了puppeteer,它有下载问题。任何建议表示赞赏。
谢谢
答案 0 :(得分:1)
出于安全原因,浏览器会隔离运行在不同来源(来源是协议,域和端口的组合)上的JavaScript代码。虽然您可以打开其他来源的页面(通过重定向,打开新窗口或在当前页面上添加框架),但是您无法直接与之交互。因此,一页上的代码无法打开另一个页面并单击该页面上的按钮。
在浏览器中解决此问题的唯一方法是编写浏览器扩展或用户脚本。浏览器扩展和用户脚本都具有较高的特权,并且能够与不受其控制的页面进行交互,但是它们需要安装在浏览器中,并且对网站的访问需要得到用户的批准(通常是在安装过程中)。 / p>
答案 1 :(得分:1)
我创建另一个答案是因为您更改了问题。
不创建链接然后单击它,由于重新加载,它肯定会破坏脚本。而是使用ajax或https://www.npmjs.com/package/fetch。这些将在后台调用给定的URL。但是您将无法单击该按钮。
所以我建议您使用URL创建一个iframe,然后尝试单击该按钮。
答案 2 :(得分:0)
如果可能的话,这将是一个巨大的安全问题。您可以使用它来吸引某人到您的页面,然后在新标签中打开他们的在线银行并进行交易。
如果您可以控制要在新标签页中打开的页面,则可以传递一些查询参数并在新页面中侦听该参数,并在设置了此参数的情况下调用一些javascript。
答案 3 :(得分:0)
也许可以将网址打开到iframe中,然后您可以控制其内容。像这样的东西:Control iframe content with javascript/html
然后,您不仅可以单击按钮,而且可以完全访问其DOM。但请确保未为该网站设置X-Frame-Options
。否则,此选项将不起作用。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
,如果那不起作用: 然后,您可能要尝试:
这些工具用于自动化测试,但是您可以将其用于您的目的。
这些工具的工作方式就像人工单击任何按钮一样。他们自己打开浏览器,单击按钮,让您知道,或者下载该项目或任何内容。
答案 4 :(得分:0)
如果您要运行一个脚本来触发新选项卡上的按钮,并且该选项卡在您的控制之下,则可以通过为选项卡提供以下脚本来实现此目的:
window.onload = function() {
document.getElementById('my-button').click();
}
我建议使用Jquery Ready Function,因为一旦页面上的所有内容加载完毕,它就会被触发。