gpt4 book ai didi

javascript - 如何将从评估返回的变量传递给Nightmare.js中的另一个评估

转载 作者:行者123 更新时间:2023-12-03 13:23:38 26 4
gpt4 key购买 nike

我目前正在尝试使用Nightmare.js和vo来提取表的数据。我要提取的表具有多个页面,我必须将该表的全部提取到一个外部HTML字符串中,该字符串稍后将转换为JSON。我正在使用的代码正在循环运行,每个循环都包含一个validate()函数。我想做的是有一个变量,该变量保留要提取的数据(字符串),并在每个循环中向其中添加新数据。但是,当我无法将变量从先前的validate()发送到下一个时,我遇到了一个问题。这是我的代码的运行功能。

function *run() {
var totalPageNumber = "";
var nightmare = Nightmare({ show: true });
yield nightmare
.goto('https://www.svgame168.com/IGKiosk/guest/login.aspx')
.select('#ctl00_ddlLanguage', 'th-TH')
.wait(3000)
.insert('input[name="ctl00$ContentPlaceHolder1$Login1$UserName"]', userName)
.insert('input[name="ctl00$ContentPlaceHolder1$Login1$Password"]', password)
.click('#ctl00_ContentPlaceHolder1_Login1_LoginButton')
.wait(3000)
.goto('https://www.svgame168.com/IGKiosk/playermgt/Default.aspx')
.click('#ctl00_ContentPlaceHolder1_searchBtn')
.wait(6000)
.evaluate(function () {
var result = "";
var nextPageExist = document.evaluate("//a[contains(., '>')]", document, null, XPathResult.ANY_TYPE, null );
nextPageExist = nextPageExist.iterateNext();result = document.querySelector("#ctl00_ContentPlaceHolder1_dataGridView").outerHTML;
var totalPageNumber = document.querySelector("#main_content_table > tbody > tr > td > table:nth-child(5) > tbody > tr > td > table > tbody > tr > td > div:nth-child(4) > span > div:nth-child(1)");

if (nextPageExist != null){
nextPageExist.className += " nextPageExist1";
}
return totalPageNumber;
})

for (var i = 2; i <= 11; i++) {
console.log("Currently on page " + i);
yield nightmare
.click(".nextPageExist" + (i - 1))
.wait(6000)
.evaluate(function (result) {
var nextPageExist = document.evaluate("//a[text()='>']", document, null, XPathResult.ANY_TYPE, null );
nextPageExist = nextPageExist.iterateNext();

console.log(result);
result += document.querySelector("#ctl00_ContentPlaceHolder1_dataGridView").outerHTML;
//console.log(result);
if (nextPageExist != null){
var pageNumber = document.querySelector("#main_content_table > tbody > tr > td > table:nth-child(5) > tbody > tr > td > table > tbody > tr > td > div:nth-child(4) > span > div:nth-child(2) > span").innerHTML
pageNumber = pageNumber.replace(/\D/g,'');
nextPageExist.className += " nextPageExist" + pageNumber;
}
return result
})
}
yield nightmare
.end()
.then(function (result) {
console.log(tabletojson.convert(result));
})
.catch(function (error) {
console.error('Search failed:', error);
});
}

我怀疑我在第二个评估中收到变量时的语法错误,但是找不到解决方案。我尝试使用它,它仍然会给出错误。
      .evaluate(function (result) {
var nextPageExist = document.evaluate("//a[text()='>']", document, null, XPathResult.ANY_TYPE, null );
nextPageExist = nextPageExist.iterateNext();

console.log(result);
result += document.querySelector("#ctl00_ContentPlaceHolder1_dataGridView").outerHTML;
//console.log(result);
if (nextPageExist != null){
var pageNumber = document.querySelector("#main_content_table > tbody > tr > td > table:nth-child(5) > tbody > tr > td > table > tbody > tr > td > div:nth-child(4) > span > div:nth-child(2) > span").innerHTML
pageNumber = pageNumber.replace(/\D/g,'');
nextPageExist.className += " nextPageExist" + pageNumber;
}
return result
}, result)

如果我从评估的每一行中删除“结果”变量,则以上代码将起作用。

最佳答案

以下是从评估方法返回结果并将其存储并移至下一页的方法

return nightmare
.click(".nextPageExist" + (i - 1))
.wait(5000) // wait till the page is loaded
.evaluate(() => {
//extract data from table
//return the data
return result
})
.then((result) => {
//recieve the data from previous step

//add the result to an global array
tableResults.push(result);

})

上面的代码可以像下面这样在数组化简器中进行迭代,与使用for循环相比,更推荐使用化简器。
let pages = [1, 2, 3, 4] // assuming there are 4 pages, create an array with a 
//length of 4

pages.reduce(accumulator, currentValue, index, arr)
{
accumulator.then(() => {
return nightmare
.click(".nextPageExist" + (currentValue - 1))
.wait(5000) // wait till the page is loaded
.evaluate(() => {
//extract data from table
//return the data
return result
})
.then((result) => {
//recieve the data from previous step

//add the result to an global array
tableResults.push(result);

})
})


}, Promise.resolve());

关于javascript - 如何将从评估返回的变量传递给Nightmare.js中的另一个评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59984116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com