首页 > 解决方案 > 使用 Selenium 在 JavaScript 变量发生变化时获取它们

问题描述

我知道我可以使用 Selenium Java API 获取 JavaScript 变量的值,如下所示

JavascriptExecutor je = (JavascriptExecutor) driver;
Long JSvar = (Long)je.executeScript("return variable");

但是 Selenium 中有没有办法在 JS 代码中更改该变量时获取该变量的每个值。例如,如果我的 JS 代码如下所示

var variable=1;
/* some code */
variable=2;
/* some code */
variable=3;

有没有办法抓住这三个值(1,2,3)?类似于在 JS 代码上设置断点,但以自动化方式。我在想我可以将这些值存储在一个数组中,然后获取该数组,但是 Selenium 中是否有另一种方法可以通过对 JS 代码的最小更改来处理这个问题?

标签: selenium

解决方案


您尚未指定 Selenium 应如何或何时检索这些值,但这里有一些 JavaScript 代码至少可以使这些值可用:

(function(window) {
    var values = [];
    var someVariable;

    Object.defineProperty(window, 'someVariable', {
        get: function() {
            return someVariable;
        },

        set: function(value) {
            someVariable = value;
            values.push(value);
        }
    });

    Object.defineProperty(window, 'someVariableValues', {
        get: function() {
            return values;
        }
    });
})(this);

无论 JavaScript 代码是执行window.someVariable = X还是简单地执行someVariable = X,setter 都会将该值推送到数组中。Selenium(或 JavaScript)可以访问window.someVariableValues以返回该变量的历史值和当前值。

使用 Selenium 检索它可能是:

JavascriptExecutor je = (JavascriptExecutor) driver;

// Get current value of variable
Long JSvar = (Long)je.executeScript("return someVariable");

// Get all values assigned to variable (this part I'm not 100% sure about)
Long[] historicalValues = (Long[])je.executeScript("return someVariableValues");

推荐阅读