我正在开发一个由AJAX / REST API调用提供大量支持的站点,该调用在完成/失败时广播事件。
我想要完成的是监听这些文档事件并在Selenium(Node.js)中触发一个函数 - 现在我正在寻找一个console.log()
- 并让该侦听器继续运行报告任何新出现的“customEvent”
我的最新实现如下:
driver = await new Builder().forBrowser('chrome').build();
await driver.get('http://www.google.com/');
...
driver.executeScript(`
document.addEventListener("customEvent", (e) => {
return e;
})`).
then( (e) => { console.log( e ); } );
我也试过executeAsyncScript()
我遇到的问题:
答案 0 :(得分:0)
感谢同事,我们找到了一种解决方案:
driver.executeScript(`
var emptyDiv = document.createElement('div');
emptyDiv.id = '${target}';
emptyDiv.style.display = 'none';
function _trackEvent(e){
var target = document.getElementById('${target}');
if( !target ){ document.body.appendChild( emptyDiv ); }
target.innerHTML += JSON.stringify(e.detail);
}
document.addEventListener("${name}", _trackEvent);
`);
driver.wait(until.elementLocated(By.id('')))
引用步骤#1中声明的DIV id
trackEvent.start('customEvent', 'testTarget');
await driver.wait(until.elementLocated(By.id('testTarget')));
let testEvent = await trackEvent.stop('testTarget');
console.log( testEvent );
return driver.executeScript(`
return document.getElementById('${target}').innerHTML;
`).then(( data )=>{
return data;
});
const trackEvent = {
start : ( name, target ) => {
driver.executeScript(`
var emptyDiv = document.createElement('div');
emptyDiv.id = '${target}';
emptyDiv.style.display = 'none';
function _trackEvent(e){
var target = document.getElementById('${target}');
if( !target ){ document.body.appendChild( emptyDiv ); }
target.innerHTML += JSON.stringify(e.detail);
}
document.addEventListener("${name}", _trackEvent);
`);
},
stop : ( target ) => {
return driver.executeScript(`
return document.getElementById('${target}').innerHTML;
`).then(( data )=>{
return data;
});
}
};
有了这一切,硒不会试图同时做两件事。 Selenium正在进行测试,网站(它旋转起来)正在为我们监听这些事件。
唯一的停顿是Selenium等待我们的executeScript JS创建的新DIV的存在。