Javascript 如何使用事件侦听器退出selenium webdriver?

Javascript 如何使用事件侦听器退出selenium webdriver?,javascript,node.js,selenium,asynchronous,selenium-webdriver,Javascript,Node.js,Selenium,Asynchronous,Selenium Webdriver,上下文。 我正在一个电子应用程序中运行几个SeleniumWebDriver实例。 用户可以选择同时运行的实例数、要运行的实例总数和启动操作(例如滚动网页)。我认为这个问题可以推广到简单地并行运行一系列异步函数。但我认为可能有一些方法来解决这个问题 问题。 我正在尝试实现一个停止按钮。它应该关闭所有正在运行的webdriver实例。我们知道目前有多少实例正在运行,以及用户选择的总数 代码片段。 $('startAction')。在('click',异步函数()上{ //我删除了不相关的东西,上面

上下文。

我正在一个电子应用程序中运行几个SeleniumWebDriver实例。 用户可以选择同时运行的实例数、要运行的实例总数和启动操作(例如滚动网页)。我认为这个问题可以推广到简单地并行运行一系列异步函数。但我认为可能有一些方法来解决这个问题

问题。

我正在尝试实现一个停止按钮。它应该关闭所有正在运行的webdriver实例。我们知道目前有多少实例正在运行,以及用户选择的总数

代码片段。

$('startAction')。在('click',异步函数()上{
//我删除了不相关的东西,上面有一些验证
//selectedProfiles是一个对象,其中包含有关用户选择的webdriver实例的一些信息
让uuid、browser、ws;
让允诺=[],
P
const streams=parseInt(document.getElementById('streams').value);
const launchMain=async()=>{
for(设i=1;i{
uuid=selectedProfiles[val].uuid;
browser=selectedProfiles[val]。浏览器;
开关(动作){
案例“智能饼干机器人”:
{
constURL=document.getElementById('actions\u input')。值;
常量启动=异步()=>{
让能力;
如果(浏览器==“模拟”){
capabilities=capabilities.chrome();
}
如果(浏览器=='stealthfox'){
capabilities=capabilities.firefox();
}
ws=等待启动配置文件(uuid);
让驱动程序=等待新的生成器()
.usingServer(ws)
.具备能力(能力)
.build();
司机。推(司机);
解析(烹饪(驱动程序、url));
}
验证(url)?启动():错误();
打破
}
违约:
{
//还有其他一些情况,我认为它们无关紧要
拒绝(appendLogsFile('出现问题,请重试');
}
}
});
承诺人推(p);
}
等待承诺。所有(承诺)。然后(()=>{
log('其中一个线程已成功解析');
允诺=[];
})
}
}
流>对象。键(selectedProfiles)。长度?
createError(document.querySelector('.profiles\u error\u wrapper'),
“线程数量应低于所选配置文件数量”):
launchMain();
});
可能的解决方案

  • 我试图为stop按钮创建一个
    quit
    布尔变量和一个事件侦听器。在
    cooking()
    中运行任何操作之前,带有操作算法的函数将检查quit是否为false。这是可行的,但这是一个糟糕的解决方案。它将等待cooking()中循环中的所有内容首先完成

  • driver.quit()
    强制到webdriver的每个运行实例中。我不知道如何中断正在运行的异步链,以及这是否可能

  • 使用子流程。我觉得这是最好的。应该可以在自己的子进程中启动webdriver的每个实例,然后在用户单击停止按钮时简单地杀死这些实例

  • 有些东西我没看到。这就是我决定在这里问这个问题的主要原因——我确信我只是错过了一些显而易见的东西


  • 您添加的代码只是javascript,没有使用selenium。@Jortega您可以在
    launch()
    函数中看到webdriver初始化。其他selenium逻辑位于
    cooking()
    函数中。但我认为这是不相关的,因为它只是一个由
    wait driver.get()
    wait driver.executeScript()
    函数组成的链,可以使用setTimeout进行轮询吗?可能每个webdriver使用代理对象?。。。从来没有在Javascript中尝试过这种事情,它总是让我的大脑受伤。在Java中,您有一个“propertyChangeListener”,它帮助将内容分派回主运行线程。(顺便说一句,不要将“异步”误认为是“多线程”…javascript并不是真正的多线程…所以您的驱动程序不会同时运行。Selenium在功能上也不是异步的…)