如何在函数内部使用赋值变量,在函数之外

How to use the assigned variable inside of a function, out of it,

本文关键字:函数 变量 赋值 内部      更新时间:2023-09-26

我使用的是Webdriverjs。我想在函数中分配一个变量,然后使用该结果与我从csv文件中检索到的一些数据进行比较。如果我想在从网页中读取元素的函数中比较这两个,那么来自csv的数据的值将是数组中的最后一项。如果我想在函数外部使用函数的结果并将其与来自csv的数据进行比较,那么包含函数(textValue)结果的变量(pageProductName)将是未定义的,即使我在函数外部(全局)定义了变量。我能做些什么来使用函数外的textValue的值?或我能做些什么让从csv中检索到的数据在函数中的正确顺序?这是我的代码的一部分,我有问题:

reader.addListener('data', function(data){
                allEntries.push(data);
         });
reader.addListener('end', function(end)
                { var i=0;
                    console.log(allEntries.length);
                   for(var j=0; j<allEntries.length;j++)
                      {
                       ProductURLArray[i]=(BaseURL+allEntries[j]['col3']+".html");
                       ProductNameArray[i]=allEntries[j]['col2'];
            var url = ProductURLArray[i];
            var name = ProductNameArray[i];
            driver.get(url);
            driver.sleep(3000);
            driver.findElement(webdriver.By.css('.product-name h1')).getText().then(function(textValue){
                        pageProductName=textValue;
                                    });
            console.log(pageProductName);
            assert.equal(pageProductName, name);
}
});

变量赋值在promise中,promise将在将来的某个时刻解决,而不一定在调用时解决。

这个原理和为什么getText()调用不返回函数中的变量以及为什么你必须链接一个承诺来对该值进行操作是一样的。

你需要链接另一个'then'调用,以保证在赋值后对值进行操作。在这种情况下,最好使用给定值来解析promise,而不是使用全局变量。

由于getText().then承诺,您的pageProductName将不会被分配,直到函数退出后的某个时间。此外,for循环使测试复杂化(我假设这是一个单元测试),因为所有这些承诺都需要在此单个测试完成之前完成。

在不知道测试框架细节的情况下,这有点棘手,但如果它提供了一个设置机制(类似于mocha的before),那么你应该将CSV读取移到其中(注意,如果CSV包含静态测试数据,那么直接在测试中声明它,使生活变得容易得多)。最后需要注意的是,您需要使用异步测试,因为您的测试将在代码完全完成执行(承诺)之前退出。看看mocha如何通过向每个测试传递done回调参数来实现这一点。

所以下面是一个通用的代码方法,你所追求的,但可能不是你需要的解决方案;)

d = webdriver.promise.defer();
d.then(function(items) {
    return webdriver.promise.map(items, function(item) {
        var url = BaseURL + item['col3'] + ".html";
        var name = item['col2'];
        driver.get(url);
        return driver
            .findElement(webdriver.By.css('.product-name h1'))
            .getText()
            .then(function (text) { return webdriver.promise.fulfilled(text === name); });
    });
})
.then(function (arr) { assert.equal(arr.every(function(item) { return item === true; }), true); })
.then(function () { done(); });
var reader = // get your reader
var allEntries = [];
reader.addListener('data', function (data) { allEntries.push(); });
reader.addListener('end', function () { d.fulfill(allEntries); });

我刚刚使用了一个文本编辑器,所以要注意它可能需要"修复"。

上面代码的快速解释:

  • 我创建了一个承诺(尚未解决)
  • 我链接一个承诺,将
    • 对传入数组的每个元素执行测试
    • 映射函数返回一个承诺,其中包含您所追求的比较结果
  • 我链接一个承诺,然后断言所有比较都为真
  • 链接一个执行异步完成回调的承诺(实现将取决于测试框架,这就是mocha的做法)
  • 注意此时还没有代码运行
  • 我已经添加了你的代码,读取你的输入数据,现在解决d承诺一旦它有所有的数据

我希望以上是清楚的,如果你有什么不确定的,请告诉我。

没有初始化变量。为了能够使用它,您必须首先初始化您的全局变量。像这样的东西会有帮助

var pageProductName = null;
driver.findElement(webdriver.By.css('.product-name h1')).getText().then(function(textValue){
         pageProductName=textValue;                      
         });
console.log(pageProductName.toString());