2017-06-17 40 views
0

我正在爲動態網頁編寫頁面刮除器。該頁面有一個初始加載,然後在加載時間較短後加載其餘內容。使用Electron(NightareJS)反覆點擊頁面上的元素

我已經考慮了負載,併成功地從頁面上刮掉了HTML,但頁面並沒有一次加載所有內容。而是通過GET請求URL加載指定數量的內容,然後在頁面上有一個「Get more」按鈕。我的目標是點擊這個「Get More」按鈕,直到頁面上加載所有內容。對於那些想知道的,我不希望通過GET URL一次加載所有內容,因爲它們對服務器的影響。

我被困在形成循環或迭代,這將允許我重複點擊該頁面。

const NIGHTMARE = require("nightmare"); \t \t 
 
const BETHESDA = NIGHTMARE({ show: true }); 
 

 
BETHESDA 
 
    // Open the bethesda web page. Web page will contain 20 mods to start. 
 
    .goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=") 
 
    
 
    // Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed. 
 
    .wait(".tile"); 
 

 
let additionalModsPresent = true; 
 
while(additionalModsPresent) { 
 
    setTimeout(function() { 
 
    BETHESDA 
 
     .wait('div[data-is="main-mods-pager"] > button') 
 
     .click('div[data-is="main-mods-pager"] > button') 
 
    }, 10000) 
 
    
 

 
    additionalModsPresent = false; 
 
} 
 

 

 
// let moreModsBtn = document.querySelector('div[data-is="main-mods-pager"] > button'); 
 

 
    // .end() 
 
    BETHESDA.catch(function (error) { 
 
    console.error('Search failed:', error); 
 
    });

我的想法迄今爲止一直使用while循環,試圖點擊一些時間間隔之後的按鈕。如果發生錯誤,可能是因爲按鈕不存在。我遇到的問題是我似乎無法讓點擊在setTimeout或setInterval內工作。我相信有某種範圍的問題,但我不知道究竟發生了什麼。

如果我可以讓click方法在setInterval或類似的東西中工作,問題就解決了。

想法?

回答

1

你可以參考這個問題(在循環運行的問題夢魘)https://github.com/segmentio/nightmare/issues/522]

我修改你的代碼給出指引。它似乎工作正常

const NIGHTMARE = require("nightmare"); 
const BETHESDA = NIGHTMARE({ 
    show: true 
}); 

BETHESDA 
    // Open the bethesda web page. Web page will contain 20 mods to start. 
    .goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=") 

    // Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed. 
    .wait(".tile"); 

next(); 

function next() { 
    BETHESDA.wait('div[data-is="main-mods-pager"] > button') 
    .click('div[data-is="main-mods-pager"] > button') 
    .then(function() { 
     console.log("click done"); 
     next(); 
    }) 
    .catch(function(err) { 
     console.log(err); 
     console.log("All done."); 
    }); 
} 

最終,它應該超時wait()按鈕,然後你可以處理catch()塊中的錯誤。當心它繼續下去:)我沒有等到最後(你可能會用完內存)。

+0

欣賞答案。我不想遇到解決方案中的任何內存問題。我想我最終會這麼做,只是經常發送一個大的GET請求。我認爲這不是什麼大問題。 –

相關問題