尝试跟踪 Firefox 中未完成的 AJAX 请求的数量

2024-01-06

我正在使用 Selenium 来测试 Web 应用程序,并且不允许修改应用程序的 javascript 代码。我试图通过使用 GreaseMonkey 覆盖 XMLHttpRequest.send 来跟踪未完成的 AJAX 请求的数量。新的 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 时似乎抛出异常

据推测,这是由于沙盒环境造成的。 任何帮助将不胜感激。我不依赖于这个解决方案,所以欢迎任何其他建议来完成我需要的事情。只是我已经尝试了其他几种,这似乎是最有希望的。要求是我需要确保计数器达到 0afterReadyState 变为 4,onreadystatechange 回调已完成执行。


我自己做了一些东西:http://jsfiddle.net/rudiedirkx/skp28agx/ http://jsfiddle.net/rudiedirkx/skp28agx/(2015 年 1 月 22 日更新)

该脚本(应该在其他任何事情之前运行):

(function(xhr) {
    xhr.active = 0;
    var pt = xhr.prototype;
    var _send = pt.send;
    pt.send = function() {
        xhr.active++;
        this.addEventListener('readystatechange', function(e) {
            if ( this.readyState == 4 ) {
                setTimeout(function() {
                    xhr.active--;
                }, 1);
            }
        });
        _send.apply(this, arguments);
    }
})(XMLHttpRequest);

以及 jsFiddle 的测试脚本:

window.onload = function() {
    var btn = document.querySelector('button'),
        active = btn.querySelector('span');

    btn.onclick = function() {
        // jQuery for easy ajax. `delay` is a jsFiddle argument
        // to keep some requests active longer.
        jQuery.post('/echo/json/', {
            delay: Math.random() * 3,
        });
    };

    updateActive();

    function updateActive() {
        active.textContent = XMLHttpRequest.active;
        requestAnimationFrame(updateActive);
    }
};

它会在每个动画帧(每秒约 60 次)更新按钮中的计数器,与 AJAX 请求分开。无论您做什么,无论点击速度有多快、点击次数多多,几秒钟后计数器都应该始终为 0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试跟踪 Firefox 中未完成的 AJAX 请求的数量 的相关文章

随机推荐

  • python 中的 p5-js map() 函数

    python中有没有像p5 js的map 这样的函数 python 中的 map 根本不一样 据我了解 在 python 中 它对序列中的所有可迭代应用相同的函数 但我需要一些可以完成 p5 js 中的 map 函数功能的东西 感谢您的帮助
  • 如何找到使用 gdb 定义的文件?

    当我打字时list mystruct进入 gdb 我收到用于定义 mystruct 的代码行 我怎样才能要求 gdb 给我它正在读取的文件来打印这些行 从 gdb python 接口获取该文件会更好 越容易解析越好 Thanks 为了显示类
  • 从输入中获取整数值并动态生成输入

    我想在焦点从 移开 时动态获取输入End Date 输入并传递天数到 JQuery 并生成它 我尝试了这段代码但不起作用 从几天中获取价值并生成面板数量 就是这样
  • C#:寻求快速数据结构以将像素添加到分区 HSB 直方图

    在我的应用程序中 我使用快速非托管代码从多个图像读取 RGB 像素值 然后将它们转换为 HSB 颜色 现在我想使用以下分区构建 HSB 直方图 色调 18 个分区 从 0 360 产生 20 个间隔 饱和度 3 个分区 从 0 1 产生 0
  • NHibernate 查询建模

    通常我会将我的 criterias hql 查询放在与实体相关的存储库 dal 类中 但最近我一直在考虑添加另一个表示查询是什么的抽象 这将使我有可能将常见行为添加到基类中的所有查询 例如分页 等 现在这些就是我的组件 与 nhiberna
  • 在常规发布请求中设置标头

    我需要设置一个header in a post请求 授权 request token 我尝试过使用 wslite 和 groovyx net http HTTPBuilder 但我总是得到 401 未授权 这意味着我无法正确设置标头 我也想
  • 在 terraform 中构建输出地图

    我有一个要创建的用户列表 一个 sns 主题列表以及创建策略以向用户授予主题权限 这些都是针对用户的命名空间 Given main tf provider aws region eu west 1 profile terraform mod
  • 将调用命令的输出封装在变量中 - PowerShell

    我有一个在远程计算机 来自 DC 上安装远程桌面服务的脚本 我现在正处于检查 RDS 是否安装在连接代理 服务器 和连接主机 服务器 上的阶段 我想使用调用命令 因为远程 powershell 会话似乎太复杂了 这是我的代码 res Inv
  • 在 Windows 中使用子进程运行 python 脚本。来自 emacswiki 的 Python 代码检查器包装器产生相同的错误

    所以我正在尝试设置 emacs wiki 中建议的 python 代码检查器 但是 我无法在命令 shell 中运行这些脚本 更不用说 emacs 了 该部分可在此处找到 http www emacswiki org emacs Pytho
  • 将字符串存储到c中的数组中

    据我所知 我可以创建一个包含项目的数组 例如 char test1 3 arrtest ao 123 但是我如何将我的输入存储到上面的代码之类的数组中 因为我只能将其编码为 input 10 scanf s input or gets in
  • 在运行时更改 iOS 模拟器的当前区域设置

    在开发一组用于将数值和日期转换为字符串的日期计算和语言规则时 我正在编写断言字符串格式化方法的结果的测试 一个虚构的断言可能如下所示 NSAssert dateString isEqualToString Three days until
  • Python-撤消标准输出重定向

    所以我知道从 在Python中将标准输出重定向到 无 https stackoverflow com questions 6735917 redirecting stdout to nothing in python 您可以抑制 print
  • os.kill 没有引发 OSError,但是我没有看到给定的 pid 正在运行

    在我的 ubuntu 服务器上运行以下命令 python c import os os kill 5555 0 这样做是为了查看 pid 5555 是否正在运行 根据我的理解 如果 pid 没有运行 这应该会引发 OSError 这不会对我
  • 已存在记录检查的逻辑,但仅在更新表单值的情况下[重复]

    这个问题在这里已经有答案了 我正在开发一个名为县经理的模块 我在检查县 mysql 表中已存在的县及其国家 地区时遇到问题 Database table 让我解释 Add Page In add page i am having 2 fie
  • [String] 与 [(String)] 有什么区别?

    Swift 中 String 和 String 有什么区别 我让他们使用let arr1 String and let arr2 String 应该没有什么区别 如果你看到的话 这是 Xcode 或 Swift 中的一个小故障 String
  • 如何使用 std::copy 将一张地图复制到另一张地图?

    我想将一个 std map 的内容复制到另一个 std map 中 我可以用吗std copy为了那个原因 显然 下面的代码是行不通的 int main typedef std map
  • 跟踪对 Delphi 中的文件夹所做的更改

    我需要编写一个 Delphi 程序来监视文件夹的更改 添加 更新 重命名和删除文件 我看到了使用 TShellChangeNotifier 的建议 这是这个问题的正确解决方案吗 我应该如何使用它 This question https st
  • 从 SQL Server 检索数据并将其转换为 json 格式?

    我正在使用 PHP 5 6 0 并连接到我的本地 SQL Server 我能够检索数据 但它是数组格式 我想把它转换成json格式 我得到什么 date gt 2013 02 05 16 02 02 000000 timezone type
  • C++ 将字符串转换为十六进制,反之亦然

    在 C 中将字符串转换为十六进制或反之亦然的最佳方法是什么 Example 像这样的字符串 Hello World 转为十六进制格式 48656C6C6F20576F726C64 并从十六进制48656C6C6F20576F726C64字符
  • 尝试跟踪 Firefox 中未完成的 AJAX 请求的数量

    我正在使用 Selenium 来测试 Web 应用程序 并且不允许修改应用程序的 javascript 代码 我试图通过使用 GreaseMonkey 覆盖 XMLHttpRequest send 来跟踪未完成的 AJAX 请求的数量 新的