通过命令行或本地脚本与浏览器JavaScript交互?

我们提供类似于imagemagick的浏览器页面JavaScript,可帮助人们将图像转换为不同的大小和格式。但是,它需要网页交互。

是否可以让人们自动化这种交互-无需将图像发送到我们的服务器(从而增加带宽成本和服务器负载)而无需用户下载无头的浏览器库(如Puppeteer)? / p>

例如,可能的流程如下:

  1. 通过命令行(或本地脚本)打开Chrome到特定网页。
  2. 将图像上传到该网页。
  3. 在网页上调用脚本。
  4. 接收脚本结果并允许本地操作。

可以启动Chrome,但尚不清楚启动后是否可以与特定的浏览器窗口进行交互。

liuyun050229 回答:通过命令行或本地脚本与浏览器JavaScript交互?

从技术上讲应该是自动化的,但是远非如此简单。

您的问题可以分为两部分:离线处理和上传自动化。


离线处理

假设您的图像处理代码完全是浏览器中的JavaScript(而不是调用本地库的模块化节点程序),则可以在浏览器中进行所有处理。

可以“ read”处理,处理和downloaded文件,而无需将任何内容发送到服务器。 该处理甚至可以在background thread中进行,从而保持UI响应能力,例如不错的进度条。

可以使用Service Worker或静态html + javascript在线托管代码本身。 一旦被访问或部署,两者都可以离线打开和执行。 (请注意,Chrome严格限制了静态html,包括对网络工作者的严格限制。 Google希望您保持在线状态。)


上传自动化

如上所述,可以通过页面内JavaScript读取通过文件输入选择或拖放到浏览器中的文件,但我将其传统上称为“上传”操作。

Chrome具有一些自动化扩展,最著名的是Kantu,但是由于Chrome的security restriction,它们无法处理文件上传。

因此,如果要自动选择文件,则需要使用本机的浏览器外自动化工具,例如Kantu的XModulesAutoHotkeySikuliX。存在商业解决方案,但是由于您没有无头浏览器的特殊要求,因此存在类似的限制。

  • AutoHotkey将专注于模拟键盘(打开浏览器,等待5秒钟,按Tab 10次,按Enter,等待2秒钟,键入文件名,按Enter,依此类推),并且可以编译为一个可部署的exe。

  • Sikulix的功能更强大,但也更难分发。只是Java运行时大于浏览器。

  • Kantu + XModules介于两者之间。用户将需要安装浏览器扩展,本机扩展,但是一旦完成,浏览器中的所有事情都会(或多或少)发生。

这三种方法都涉及模拟键入文件名,因为据我所知,没有一种更简单的方法可以在用户启动的(无头)Chrome中自动执行该文件。

图像文件的名称可以作为参数传递给AutoHotkey和Sikulix的命令行,也可以存储在文件中并在脚本为Kantu的情况下由脚本读取。

在所有三种情况下,自动化都会模拟用户,并且真实用户在脚本运行时切勿触摸计算机,否则自动化会中断。


命令行如何?

或者,如果您的目标是自动化而不部署浏览器,则可以考虑使其成为命令行node.js程序,并将其打包为exe。

可分发内容比已编译的AutoHotkey重,但是活动部件少得多,因此可靠得多:

  • 独立于Chrome版本或XModules。
  • 所有处理过程都是在自己的过程中进行,而不是劫持用户的Chrome。
  • 可以无头执行,对于自动化非常重要。
  • 灵活的命令行参数。

但是我喜欢浏览器自动化,它非常简单

再想一想。

根据我的经验, 许多事情都会使浏览器/ GUI自动化失效:

  1. 异常的屏幕分辨率,浏览器缩放,操作系统缩放或最后一次记住的Chrome大小,会使您的页面失真至无法识别。
  2. 可更改页面元素(例如广告拦截器)的浏览器扩展。
  3. IME和其他使用热键拦截键盘输入的程序。
  4. 弹出式程序,例如防病毒,Windows更新或插入CD。
  5. 意外锁定,睡眠,注销,键盘上的剩余键或电源中断。
  6. 或者一个简单的Chrome更新程序,可以打破您所依赖的100种东西。

所以,是的,这是您为什么要精打细算地完成计算机自动化的原因。


我的代码安全吗?

如果您担心脚本的安全性,请不要担心。 您希望处理在客户端发生的那一刻,猫就掉了。

从技术上讲,您的代码受版权保护。 但是祝你好运。 如果您想使代码不进行提取/解密/取消混淆/任何形式的处理(咳嗽),则需要将其保留为在线黑匣子,而无需客户端处理。

,

构建Web应用程序的一种方法是:

1)将console.log重定向到标准输出(请参见此处:In Chrome,how can I get the javascript console output to stdout/stderr),可能带有适当的--log-level标志并将错误消息重定向到其他位置,因此某些随机消息不会破坏整体东西,

2)从脚本级别开始,而不是/,除了保存结果文件外,console.log记录在Base64中,

3)并从CLI端使用使Base64成为适当文件(以及任何其他处理)的管道。

,

Selenium WebDriver应该足够了,请使用ChromeDriver在Chrome上自动执行任务。

要上传文件,请选择项目并使用sendKeys read more here

driver.findElement(By.id("myUploadElement"))
.sendKeys("<absolutePathToMyFile>");
,

使用PowerShell可以实现所有这一切。使用Powershell,您可以打开浏览器(使用Powershell可以自然而然地支持IE)。您可以打开网页,填写表格,下载或上传数据,获取对象,检查等。

webpage下访问以获取更多详细信息:

希望这会有所帮助。

本文链接:https://www.f2er.com/3164847.html

大家都在问