当前位置: 首页 > 知识库问答 >
问题:

selenium webdriver和nodejs中的for循环不异步执行

裴嘉良
2023-03-14
var webdriver = require('selenium-webdriver');
var promise = require('selenium-webdriver').promise;
var By = webdriver.By;
var mongoose = require('mongoose');
var config = require('../config/db');
var chrome = require('selenium-webdriver/chrome');
var path = require('chromedriver').path;
var service = new chrome.ServiceBuilder(path).build();
chrome.setDefaultService(service);
var ScrapperModel = require('../models/scrapper-model');
function test1() {
    var dbObj = new ScrapperModel({ name: 'Tom' });
    dbObj.save(function(err, doc){
        if(err){
            console.log("Error saving object in schema"+err);
        }
    });

    var browser = new webdriver.Builder().usingServer().withCapabilities({ 'browserName': 'chrome' }).build();
    browser.get('https://www.example.com/').then(function () {
        return browser.getTitle();
    }
    ).then(function (title) {
        console.log("Title is" + title);
    }).then(function(){
        return browser.findElement(By.id('orderNumber')).sendKeys('12345');  
    }).then(function(){
        return browser.findElement(By.id('orderEmail')).sendKeys('test@test.com');   
    }).then(function(){
        return browser.findElement(By.id('postalCode')).sendKeys('46204');   
    }).then(function(){
        return browser.findElement(By.name('findorder')).click();  
    }).then(function(){
        return browser.findElements(By.xpath('//*[@class="order-shipment-table"]'));
    }).then(function(elements){
        console.log("****"+elements.length);
        elements.forEach(function(element){
            //console.log("---"+element.getAttribute('class'));
            return browser.findElement(By.id('someid'));
            anotherFunction(browser);
            //console.log("++"+element.getAttribute('class'));
        });     

    }).then(function () {
        console.log("closing");
        return browser.close();
    })
        .catch(function (err) {
            console.log("err" + err);
            return browser.close();
        });
};

function anotherFunction(browser){
consolelog("inside function");
}
module.exports.test1 = test1;

如果我像下面这样使用forloop-

.then(function(){
    for (var row = 2; row < count; row++) {
        return driver.findElement(By.id('itemid')).then(function(order){
            console.log("++++"+row);
            return order.findElement(By.xpath('//table/tbody/tr[' + row+ ']/td[2]/span[1]')).getText();
        }).then(function(productName){
            console.log("i am ok .."+productName);
       });          
    }
}).then(function(){
    return driver.close();
})

它只对Row的最后一个值执行driver.findElement命令。如果我在这个for循环中放入第一个return语句(如上),它只对row=2执行并关闭浏览器。

共有1个答案

澹台成龙
2023-03-14

以下代码在同步循环中是异步的:

for (var row = 2; row < count; row++) {
        return driver.findElement(By.id('itemid')).then(function(order){
            console.log("++++"+row);
            return order.findElement(By.xpath('//table/tbody/tr[' + row+ ']/td[2]/span[1]')).getText();
        }).then(function(productName){
            console.log("i am ok .."+productName);
       });          
}

实际发生的情况是,当循环开始时,row的值=2。然后调用异步函数driver.findElement。回调进入队列,然后行值更新为3,发生同样的事情。

现在当回调被激发时(当异步任务完成时),行的值是最后一个值。

const P = require('bluebird');
const _ = require('lodash');
const rows = [2, 3, 4, 5];

const exampleFunction = (rows) => {
    return P.try(() => {
        const promises = _.map(rows, (e) => {
        return driver.findElement(e);
    });

    return P.all(promises);
    }).then((results) => {
        return P.all(_.map(results, (e, index) => {
            return e.findElement(By.xpath('//table/tbody/tr[' + rows[index]+ ']/td[2]/span[1]')
        }));
    });
}
 类似资料:
  • 我是NodeJs的初学者,请原谅。下面的lambda函数是在S3中压缩/压缩文件,并将压缩后的文件上传回S3。包含要压缩的键的列表。如果您注意到(listOfKeys中的const file)的

  • 问题内容: 我是JavaScript和node.js的新手。我想遍历目录并将所有文件统计信息(而不是其他目录)添加到数组中。如下所示,我的代码存在问题,因为回调可能在for循环完成后被调用,因此在回调方法中使用“ i”变量将不起作用。但是代码应如何显示,以便以下代码段起作用?它与闭包有关吗? 感谢帮助! 问题答案: 您需要使用闭包是正确的。您应该将循环的内容包装在一个自调用函数中,以保留每次迭代的

  • 本文向大家介绍详解nodejs异步I/O和事件循环,包括了详解nodejs异步I/O和事件循环的使用技巧和注意事项,需要的朋友参考一下 事件驱动模型 现在我们来看看nodejs中的事件驱动和异步I/O是如何实现的. nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出消息队列(event-queue)中的消息进行处理,处理过程基本上就是去调用

  • 我对一个异步函数有点拘泥于此。 我要完成的是创建一个batchProcessing函数(batchGetSubs),它将循环访问一组文件,读取一个ID,然后发出一个API请求,等待一个响应(问题),然后用格式化的数据写入一个新文件。 问题--我尝试了异步和等待,以及推送承诺和尝试使用承诺.所有这些都是为了等待承诺的解决,但没有成功。当前的行为是,在API调用实际返回所有数据之前,我获取Promis

  • 问题内容: 这个问题已经在这里有了答案 : 循环内的JavaScript封闭-简单的实际示例 (44个答案) 2年前关闭。 我正在运行以下形式的事件循环: 我正在尝试显示一系列警报,显示从0到10的数字。问题是,当触发回调函数时,循环已经经历了几次迭代,并且显示了更高的值。有关如何解决此问题的任何建议? 问题答案: 在启动所有异步操作时,循环将立即运行到完成。当他们将来完成某个时间并调用其回调时,

  • 本文向大家介绍C#中for循环、while循环循环执行的方法,包括了C#中for循环、while循环循环执行的方法的使用技巧和注意事项,需要的朋友参考一下 先给大家介绍下C#中的循环执行for循环 在这一节练习中,我们向大家介绍一下C#中的另一种重要的循环语句,for循环。 表达式1:一般为赋值表达式,给控制变量赋初值; 表达式2:逻辑表达式,循环控制条件;当条件为真时,循环执行循环体中的语句。