Я работаю над сайтом, который сильно зависит от вызовов API AJAX / REST, которые транслируют события при завершении / сбое.
То, что я пытаюсь выполнить, - это прослушивать эти события документа и запускать функцию в Selenium (Node.js) - прямо сейчас я выбираю console.info() - и держать этот слушатель включенным, чтобы сообщать о любых новых случаях " 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.info( e ); } );
Еще пробовал executeAsyncScript()
Проблемы, с которыми я сталкиваюсь:



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Благодаря коллеге мы нашли обходное решение:
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(''))), ссылаясь на идентификатор DIV, объявленный на шаге # 1
trackEvent.start('customEvent', 'testTarget');
await driver.wait(until.elementLocated(By.id('testTarget')));
let testEvent = await trackEvent.stop('testTarget');
console.info( 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 ожидает существования нового DIV, созданного нашим executeScript JS.
Вы пробовали это для живых данных? Таким образом, добавленный элемент будет часто обновляться, и, следовательно, вместо использования getElementById, я думаю, Selenium должен прослушивать события этого элемента.