首页 > 解决方案 > 在 Selenium Node js 中监听事件后如何运行 driver.executeScript()?

问题描述

这是我正在尝试的代码,但它给出的内容没有定义。我想在监听事件后运行第二个 executeScript() 函数。

driver.getWindowHandle().then(function(window){
driver.executeScript(function(){
		window.addEventListener('customEvent', function(e){
    	console.log(content = e.detail);
      //return content['data'];
    })
	}).then(function(){
  	driver.manage().timeouts().implicitlyWait(20000);
    driver.executeScript("return content['data']").then(function(val){
    	console.log(val);
    })
  })
});

标签: node.jsseleniumselenium-webdriverevent-handling

解决方案


我认为您需要等到事件被触发。但这是不可能的,因为 Selenium 无法监听 Web 浏览器中的事件。

您可以做的是修改事件侦听器以向 Web 应用程序写入内容。然后使用 Selenium 等待它。

我下面的代码添加了一个事件侦听器来侦听该事件customEvent,然后立即打印该值。它将打印null.

当事件被触发时,它会将事件值分配给一个全局值window.content

然后我driver.wait用来检查window.content. 在它等待 1000 个周期后,我将customEvent. 您可以看到,在事件被分派后,等待将立即停止。最后,我读取了window.content值并打印出来。

driver.getWindowHandle().then(function(window){
    driver.executeScript(function(){
        window.addEventListener('customEvent', function(e){
            window.content = e.detail;
        });
    }).then(function(){
        driver.executeScript("return window.content['data']").then(function(val){
            console.log("Initial result from event: " + val);
        });
    });
});


var counter = 0;
driver.wait(()=> {
    console.log(counter);
    if(counter++ === 1000) {
        driver.executeScript(()=>{
            var event = new CustomEvent("customEvent", {
              detail: {
                data: "TEST Data from custom event"
              }
            });

            window.dispatchEvent(event);
        });
    }

    return driver.executeScript('return typeof window.content["data"] !== "undefined"');
});

driver.executeScript('return window.content["data"]').then((val)=>{
    console.log("Result from event: " + val);
});

推荐阅读