Я использую Selenium для тестирования веб-приложения и не могу изменять код JavaScript приложения.Я пытаюсь отследить количество невыполненных запросов AJAX с помощью GreaseMonkey для переопределения XMLHttpRequest.send.Новый send () в основном обернет то, что было установлено как обратный вызов onreadystatechange, проверит readyState, увеличит или уменьшит счетчик соответствующим образом и вызовет исходную функцию обратного вызова.
Проблема, с которой я сталкиваюсьбыть проблемой привилегий, потому что, если я просто захожу на страницу в обычном браузере Firefox, открываю firebug и вставляю следующий код, кажется, что он работает нормально:
document.ajax_outstanding = 0;
if (typeof XMLHttpRequest.prototype.oldsend != 'function') {
XMLHttpRequest.prototype.oldsend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function() {
console.log('in new send');
console.log('this.onreadystatechange = ' + this.onreadystatechange);
this.oldonreadystatechange = this.onreadystatechange;
this.onreadystatechange = function() {
if (this.readyState == 2) {
/* LOADED */
document.ajax_outstanding++;
console.log('set ajax_outstanding to ' + document.ajax_outstanding);
}
this.oldonreadystatechange.handleEvent.apply(this, arguments);
if (this.readyState == 4) {
/* COMPLETED */
document.ajax_outstanding--;
console.log('set ajax_outstanding to ' + document.ajax_outstanding);
}
};
this.oldsend.apply(this, arguments);
};
}
Теперь, если я использую слегка измененную версиюэтого фрагмента из пользовательского сценария GreaseMonkey, например, так:
unsafeWindow.document.ajax_outstanding = 0;
if (typeof unsafeWindow.XMLHttpRequest.prototype.oldsend != 'function') {
unsafeWindow.XMLHttpRequest.prototype.oldsend = unsafeWindow.XMLHttpRequest.prototype.send;
unsafeWindow.XMLHttpRequest.prototype.send = function() {
GM_log('in new send');
GM_log('this.onreadystatechange = ' + this.onreadystatechange);
this.oldonreadystatechange = this.onreadystatechange;
this.onreadystatechange = function() {
if (this.readyState == 2) {
/* LOADED */
unsafeWindow.document.ajax_outstanding++;
GM_log('set ajax_outstanding to ' + unsafeWindow.document.ajax_outstanding);
}
this.oldonreadystatechange.handleEvent.apply(this, arguments);
if (this.readyState == 4) {
/* COMPLETED */
unsafeWindow.document.ajax_outstanding--;
GM_log('set ajax_outstanding to ' + unsafeWindow.document.ajax_outstanding);
}
};
this.oldsend.apply(this, arguments);
};
}
и я иду на страницу, делаю что-то, что вызывает запрос AJAX, я получаю следующее сообщение в консоли ошибок JavaScript:
http://www.blah.com/gmscripts/overrides: in new send
uncaught exception: [Exception... "Illegal value" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: file:///tmp/customProfileDir41e7266f56734c97a2ca02b1f7f528e1/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js :: anonymous :: line 372" data: no]
Таким образом, создается впечатление, что при попытке доступа к this.onreadystatechange выдается исключение
Предположительно, это связано с изолированной средой.Любая помощь будет принята с благодарностью.Я не привязан к этому решению, поэтому любые другие предложения для того, что мне нужно, приветствуются.Просто я пробовал несколько других, и это кажется самым многообещающим.Требование заключается в том, что мне нужно убедиться, что счетчик становится равным 0 после , readyState переходит в 4 и обратный вызов onreadystatechange завершает выполнение.