噩梦-避免多次使用并等待[保持中]

问题描述 投票:-1回答:1

如何避免在此代码中多次使用clickwait?如果我有大量代码,代码将很丑陋。有没有办法通过循环来做到这一点?

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);
    });
javascript promise es6-promise nightmare
1个回答
0
投票

如果您希望保留链接,则可以编写如下的自定义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);
    });
© www.soinside.com 2019 - 2024. All rights reserved.