如何自动化ElectronJS应用

时间:2018-08-14 18:25:34

标签: javascript automation electron puppeteer nightmare

我们正在寻求在桌面工作中开发用于特定网站自动化的ElectronJS应用,其中包括登录,表单填写,报告下载等常见任务。

我们已经尝试了ElectronJS,Spectron,NightmareJS,Puppeteer等基础教程,并且它们都可以单独很好地工作,但是相互集成的文档很少(尽管有开放的github问题)。

我们要实现以下目标:

  • 登录状态(session)不应在ElectronJS应用关闭时删除,而应在应用重启时可用。
  • 很少有菜单按钮可以在现有browserWindow上启动一些自动化任务,例如下载,填写表格等

我们不需要无头的自动化,因为在幕后发生了一些魔术。我们仅需要当前页面上基于菜单/按钮单击的操作/任务即可。

NightmareJSPuppeteer等似乎都启动了自己的网页实例(因为它们是为测试独立应用程序而构建的),但是我们需要的是使现有BrowserWindows自动化

puppeteernightmarejs是实现此类目标的正确工具吗?如果是,有任何文档吗?

否则,我们是否应该在控制台中注入自己的本机JS事件(例如mouseclick等事件以执行操作?

5 个答案:

答案 0 :(得分:1)

您可以使用puppeteer-core。默认情况下,core版不会下载Chromium,如果要控制Electron应用程序,则不需要下载。

然后在测试中调用launch方法,在该方法中,您将electron定义为可执行文件而不是Chromium,如下例所示:

const electron = require("electron");
const puppeteer = require("puppeteer-core");

const delay = ms =>
  new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, ms);
  });

(async () => {
  try {
    const app = await puppeteer.launch({
      executablePath: electron,
      args: ["."],
      headless: false,
    });
    const pages = await app.pages();
    const [page] = pages;

    await page.setViewport({ width: 1200, height: 700 });
    await delay(5000);
    const image = await page.screenshot();
    console.log(image);
    await page.close();
    await delay(2000);
    await app.close();
  } catch (error) {
    console.error(error);
  }
})();

简单的演示仓库: https://github.com/peterdanis/electron-puppeteer-demo

答案 1 :(得分:0)

Spectron是电子构建应用的最佳选择。

您将有权使用所有电子API。我们只能通过spectron来启动和停止您的应用。

我们可以运行打包应用程序,也可以不打包运行。

https://electronjs.org/spectron

答案 2 :(得分:0)

您可以使用Spectron,但如果您想查看文档,Spectron会使用webdriverio,该文档具有很好的文档。

我建议您使用Spectron,因为我尝试使用java-selenium自动化测试,但是在某些情况下无法通过。如果要使用硒,请编写以下代码来设置将电子应用设置为chromedriver的功能。

 ChromeOptions options = new ChromeOptions();
    options.setBinary(binaryPath);
    options.addArguments("--app=" + argPath);
    options.setCapability("chromeOptions", options);
    driver = new ChromeDriver(options);   

希望这对您有所帮助。

答案 3 :(得分:0)

使用Selenium和ChromeDriver的Java中的自动化脚本

package setUp;

import helper.Constants;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;


public class Test {

       public static void main(String[] args) {

             System.setProperty(Constants.WebDriverType, Constants.WebDriverPath + Constants.WindowsDriver);

             ChromeOptions opt = new ChromeOptions();

             DesiredCapabilities capabilities = new DesiredCapabilities();

             capabilities.setCapability("chromeOptions", opt);
             capabilities.setBrowserName("chrome");
             capabilities.setVersion("73.0.3683.121");

             ChromeOptions options = new ChromeOptions();
             options.merge(capabilities);
             options.setBinary("C:\\\\Program Files\\\\Audio\\\\Audio-Configuration\\\\Audio-Configuration.exe");
             options.setCapability("chromeOptions", options);
             ChromeDriver driver = new ChromeDriver(options);

             try {
                    Thread.sleep(5000);
                    WebElement webElement = driver.findElement(By.xpath(
                                 "/html/body/app-root/mat-drawer-container/mat-drawer/div/app-bottom-side-nav/div/app-settings-nav/div/div/a/div"));                        
                    webElement.click();
             } catch (Exception e) {
                    System.out.println("Exception trace");
                    System.out.println(e);
             }
       }
}

使用Spectron在JavaScript中使用自动化脚本(在ChromeDriver和WebDriverIO的顶部构建)。

const Application = require("spectron").Application;

const path =
  "C:/Program Files/Audio/Audio-Configuration/Audio-Configuration.exe";
const myApp = new Application({
  path: path,
  chromeDriverArgs: ["--disable-extensions"],
  env: {
    SPECTRON: true,
    ELECTRON_ENABLE_LOGGING: true,
    ELECTRON_ENABLE_STACK_DUMPING: true
  }
});

const windowClick = async app => {
  await app.start();
  try {
    // Identifying by class name
    await app.client.click(".ic-setting");

    // Identifying by Id
    // await app.client.click("#left-btn");
  } catch (error) {
    // Log any failures
    console.error("Test failed", error.message);
  }
  // Stop the application
     await app.stop();
};

windowClick(myApp);

答案 4 :(得分:0)

如果集成电子梦night是一个很好的库,即使可以随时分发,也可以使用它,以下是同一resource1的有用文档 和