使用Webdriverio链接承诺

时间:2016-07-20 16:39:38

标签: javascript node.js webdriver-io

首先,让我指出我是node.js和异步编程的新手,所以我的代码可能非常糟糕。我正在尝试使用webdriverio和cheerio构建一个webscrapper。在这个webscrapper中,我必须进行查询,在内容页面和结果页面之间移动时废弃查询结果,然后在结果耗尽后执行新查询。这是我到目前为止所提出的代码(假设客户端已经启动并且函数" make_new_query()"正在从" .then()&#34调用;行动):

function scrapt_content(){
// if array of content links is exhausted -> move to next page or perform new query
if(contents_pointer == contents.length){

    return client.isExisting("li.next-page > a").then(function(isExisting){
        // if there is a link to a a new page of results -> move to new page
        if(isExisting){
            return change_pages();
        } else {
            return make_new_query();
        };
    });

// change to new and scrapt it
} else {

    // var parsed = cheerio.load(res);
    ... scrap content using cherio ...
    .
    .
    .
    contents_pointer++;

    return scrapt_content(); 

    })
};
};

function change_pages(){

client
    .click("li.next-page > a")
    .getAttribute("h2 a", "href");
    .then(function(res){
        contents_pointer = 0;
        news_links = res;
        return scrapt_content();
    })
}

function make_new_query(){
.
.
.
client.url(new_query_url)
    .getAttribute("h2 > a", "href")
    .then(function(res){
        content_links = res;
        return scrapt_content();
    })
}
}

问题是,在到达第一页要废弃的内容之后(代码执行查询并进入此页面,其中包含content_links数组中的第一个链接),webdriver关闭。这就像代码首先执行函数change_pages一样,它调用scrapt_content而不是提前终止。所以,我在这个函数中使用链接动作时假设错误。在尝试将这些行为联系起来时,有人能指出我的错误吗?

1 个答案:

答案 0 :(得分:0)

你必须缺少一些代码,因为我无法判断你正在关闭webdriver。但是,您需要使用promise来确保函数在异步操作完成之前不会返回。由于您在节点中,因此您拥有内置的大多数ES6功能,因此您可以添加"使用严格的"在代码的最顶部(启用ES6功能),然后执行此操作(例如使用scrapt_content函数:



//this function returns a promise
function scrapt_content(){
  return new Promise(function(resolve, reject){
    InsertyourAsyncFunctionHere().then(function(){
      resolve();
    });
  });
};

//setting promise resolve/reject callbacks with then and catch
scrapt_content.then(function(){
  //resolve (success) callback content here
}).catch(function(err){
  //reject (error) callback contenthere
  console.log(err.message)
});