如何避免在此代码中多次使用click和wait?如果我有大量代码,代码将很丑陋。有没有办法通过循环来做到这一点?
var Nightmare = require('nightmare');
var nightmare = Nightmare({
show: true
});
nightmare
.goto('MY_SITE_ADDRESS')
.click('div[id="feed_item_0"]')
.wait('div[id="accordion_wide_0"] > div > div > div > div > div > div > div > div > div > span')
.click('div[id="feed_item_1"]')
.wait('div[id="accordion_wide_1"] > div > div > div > div > div > div > div > div > div > span')
.click('div[id="feed_item_2"]')
.wait('div[id="accordion_wide_2"] > div > div > div > div > div > div > div > div > div > span')
.click('div[id="feed_item_3"]')
.wait('div[id="accordion_wide_3"] > div > div > div > div > div > div > div > div > div > span')
.click('div[id="feed_item_4"]')
.wait('div[id="accordion_wide_4"] > div > div > div > div > div > div > div > div > div > span')
.evaluate(function () {
data = document.querySelectorAll('div[id^="accordion_wide_"]');
myArray = [];
data.forEach(element => {
myArray.push(element.textContent);
});
return myArray;
})
.then(function (data) {
console.log(data);
})
.catch(function (error) {
console.error(error);
});
如果您希望保留链接,则可以编写如下的自定义plugin。
var Nightmare = require('nightmare');
var nightmare = Nightmare({
show: true
});
function expand (id) {
return function (nightmare) {
return nightmare
.click('div[id="feed_item_' + id + '"]')
.wait('div[id="accordion_wide_' + id + '"] > div > div > div > div > div > div > div > div > div > span');
};
}
nightmare
.goto('MY_SITE_ADDRESS')
.use(expand(0))
.use(expand(1))
.use(expand(2))
.use(expand(3))
.use(expand(4))
.evaluate(function () {
data = document.querySelectorAll('div[id^="accordion_wide_"]');
myArray = [];
data.forEach(element => {
myArray.push(element.textContent);
});
return myArray;
})
.then(function (data) {
console.log(data);
})
.catch(function (error) {
console.error(error);
});