首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何自动化ElectronJS应用程序

如何自动化ElectronJS应用程序
EN

Stack Overflow用户
提问于 2018-08-15 02:25:34
回答 5查看 4.2K关注 0票数 5

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

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

我们希望实现以下目标:

  • 登录状态(session)不应在ElectronJS应用程序关闭时删除,而应在应用程序重新启动时可用。
  • 一些菜单按钮可在现有browserWindow

上启动一些自动化任务,如下载、表单填写等

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

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

对于这些目标,puppeteernightmarejs是正确的工具吗?如果是,有什么文档吗?

或者,我们是否应该在控制台中注入我们自己的原生JS事件,如mouseclick等事件来执行操作?

EN

回答 5

Stack Overflow用户

发布于 2019-01-23 02:52:12

您可以使用puppeteer-core。默认情况下,core版本不会下载铬,如果你想控制电子应用程序,就不需要下载铬。

在测试中,然后调用launch方法,将electron定义为可执行文件,而不是Chromium,如以下代码片段所示:

代码语言:javascript
运行
复制
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);
  }
})();

电子5.x.y和更高版本的更新(目前是7.x.y,我还没有在8.x.y测试版上测试它),其中使用了puppeteer.connect而不是launch方法:

代码语言:javascript
运行
复制
// const assert = require("assert");
const electron = require("electron");
const kill = require("tree-kill");
const puppeteer = require("puppeteer-core");
const { spawn } = require("child_process");

let pid;

const run = async () => {
  const port = 9200; // Debugging port
  const startTime = Date.now();
  const timeout = 20000; // Timeout in miliseconds
  let app;

  // Start Electron with custom debugging port
  pid = spawn(electron, [".", `--remote-debugging-port=${port}`], {
    shell: true
  }).pid;

  // Wait for Puppeteer to connect
  while (!app) {
    try {
      app = await puppeteer.connect({
        browserURL: `http://localhost:${port}`,
        defaultViewport: { width: 1000, height: 600 } // Optional I think
      });
    } catch (error) {
      if (Date.now() > startTime + timeout) {
        throw error;
      }
    }
  }

  // Do something, e.g.:
  // const [page] = await app.pages();
  // await page.waitForSelector("#someid")// 
  // const text = await page.$eval("#someid", element => element.innerText);
  // assert(text === "Your expected text");
  // await page.close();
};

run()
  .then(() => {
    // Do something
  })
  .catch(error => {
    // Do something
    kill(pid, () => {
      process.exit(1);
    });
  });

获取pid和使用kill是可选的。对于在某些CI平台上运行脚本,这并不重要,但对于本地环境,您必须在每次尝试失败后手动关闭电子应用程序。

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

票数 4
EN

Stack Overflow用户

发布于 2020-01-06 23:51:06

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

代码语言:javascript
运行
复制
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);
             }
       }
}

使用(构建于ChromeDriver和WebDriverIO之上)的JavaScript中的自动化脚本。

代码语言:javascript
运行
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2018-08-25 01:45:04

Spectron是电子构建应用的最佳匹配。

您将有权访问所有电子API.we可以启动和停止您的应用程序只通过光谱。

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

https://electronjs.org/spectron

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51847667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档