打开选项卡并运行脚本

时间:2020-06-07 19:14:31

标签: javascript

以下操作无效:

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,它有下载问题。任何建议表示赞赏。

谢谢

5 个答案:

答案 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

,如果那不起作用: 然后,您可能要尝试:

  1. https://github.com/puppeteer/puppeteer
  2. https://devexpress.github.io/testcafe/
  3. https://www.cypress.io/

这些工具用于自动化测试,但是您可以将其用于您的目的。

这些工具的工作方式就像人工单击任何按钮一样。他们自己打开浏览器,单击按钮,让您知道,或者下载该项目或任何内容。

答案 4 :(得分:0)

如果您要运行一个脚本来触发新选项卡上的按钮,并且该选项卡在您的控制之下,则可以通过为选项卡提供以下脚本来实现此目的:

window.onload = function() {
     document.getElementById('my-button').click();
}

我建议使用Jquery Ready Function,因为一旦页面上的所有内容加载完毕,它就会被触发。