【问题标题】:Open a tab and run script打开选项卡并运行脚本
【发布时间】:2020-06-08 04:11:37
【问题描述】:

以下不起作用:

window.open(‘javascript:{do something here}’)

一些安全错误并要求在此处输入不安全的内联关键字

我需要打开一个新窗口并导航到一个 url 并找到一个按钮并单击它。

我只有 url(数百个 em)我正在循环并为每个 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,它有下载问题。任何建议表示赞赏。

谢谢

【问题讨论】:

标签: javascript


【解决方案1】:

出于安全原因,浏览器会隔离在不同来源(来源是协议、域和端口的组合)上运行的 JavaScript 代码。虽然您可以打开不同来源的页面(通过重定向、打开新窗口或在当前页面上添加框架),但您不能直接与其交互。因此,一个页面上的代码不可能打开另一个页面并单击该页面上的按钮。

在浏览器中解决此问题的唯一方法是编写浏览器扩展程序或用户脚本。浏览器扩展和用户脚本都具有更高的权限,并且能够与不受其控制的页面进行交互,但它们需要安装在浏览器中,并且对站点的访问需要得到用户的批准(通常在安装过程中)。

【讨论】:

  • 谢谢,正是我想要的
【解决方案2】:

我正在创建另一个答案,因为您更改了问题。

不要创建链接然后单击它,它肯定会由于重新加载而破坏脚本。相反,请使用 ajax 或 https://www.npmjs.com/package/fetch。这些将在后台调用给定的 URL。但是您将无法单击该按钮。

所以我建议,您使用 URL 创建一个 iframe,然后尝试单击按钮。

【讨论】:

    【解决方案3】:

    如果这是可能的,那将是一个巨大的安全问题。例如,您可以使用它来引诱某人访问您的页面,然后在新标签中打开他们的网上银行并进行交易。

    如果您可以控制在新选项卡中打开的页面,那么您可以传递一些查询参数并在新页面中监听该参数,如果设置了此参数,则调用一些 javascript。

    【讨论】:

      【解决方案4】:

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

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

      我建议使用Jquery Ready Function,因为它会在页面上的所有内容加载后触发。

      【讨论】:

        【解决方案5】:

        也许将 URL 打开到 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/

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

        这些工具的工作方式类似于人类点击任何按钮。他们自己打开浏览器,点击按钮让你知道,或者下载项目或任何东西。

        【讨论】:

        • 我正在使用 Promise,点击链接后页面会重新加载,脚本不起作用
        • 好的,一个主要问题:您尝试加载的 URL 是在您的控制之下还是第三方?
        • 如果是第三方,请尝试在浏览器控制台中运行相同的脚本,看看是否正常。
        • 第三方,我已经成功抓取了我正在尝试使用 Promise 进行迭代并保存文件的所有 url(下载链接)
        • 您的目标只是下载所有资源吗?或者您想单击该第三方上的某个按钮。如果我了解您实际尝试做的事情,我可能会提供帮助。
        猜你喜欢
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        相关资源
        最近更新 更多