我们正在寻求开发一个ElectronJS应用程序为特定的网站自动化在我们的桌面工作,其中包括像登录,表格填写,报告下载等常见任务。
我们已经尝试了ElectronJS,Spectron,NightmareJS,Puppeteer等的基本教程,所有这些都可以单独工作,但很少有文档(尽管github问题是开放的)可以相互集成。
我们希望实现以下目标:
session
)不应在ElectronJS应用程序关闭时删除,而应在应用程序重新启动时可用。browserWindow
上启动一些自动化任务,如下载、表单填写等
我们不需要无头的自动化,在那里一些魔术在幕后发生。我们只需要在当前页面上基于菜单/按钮单击的操作/任务。
NightmareJS
,Puppeteer
等似乎都开始了自己的网页实例(因为它们是为测试独立的应用程序而构建的),但我们需要的是现有BrowserWindows
的自动化。
对于这些目标,puppeteer
或nightmarejs
是正确的工具吗?如果是,有什么文档吗?
或者,我们是否应该在控制台中注入我们自己的原生JS事件,如mouseclick
等事件来执行操作?
发布于 2019-01-23 02:52:12
您可以使用puppeteer-core
。默认情况下,core
版本不会下载铬,如果你想控制电子应用程序,就不需要下载铬。
在测试中,然后调用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);
}
})();
电子5.x.y和更高版本的更新(目前是7.x.y,我还没有在8.x.y测试版上测试它),其中使用了puppeteer.connect
而不是launch
方法:
// 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
发布于 2020-01-06 23:51:06
使用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);
}
}
}
使用(构建于ChromeDriver和WebDriverIO之上)的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);
发布于 2018-08-25 01:45:04
Spectron是电子构建应用的最佳匹配。
您将有权访问所有电子API.we可以启动和停止您的应用程序只通过光谱。
我们既可以运行打包的应用程序,也可以不打包的运行。
https://stackoverflow.com/questions/51847667
复制相似问题