StaleElementReferenceError。
上次就講咗其中一個用forEach黎loop開array嘅時候所遇到嘅問題。今次都係講for loop,而且唔單止for loop,甚至係任何形式嘅loop都有可能出現嘅問題。
根據 Selenium Javascript API官方文件 嘅解釋,StaleElementReferenceError係當瀏覽器嘗試搵一個已經唔再係DOM上面存在嘅元素嗰陣就會出現。呢個情況會出現嘅原因有可能係元素已經被移除(例如係jQuery嘅.remove()),又或者係你喺PC版本嘅網頁想搵手機版本先存在嘅元素。既然同looping有關,咁就應該係屬於前者。
for (let key in array) {
await browser.get(array[key]['url']).then(async () => {
let boxes = await browser.findElements(By.css('.boxes'));
// Write your codes...
});
}
await browser.get(array[key]['url']).then(async () => {
let boxes = await browser.findElements(By.css('.boxes'));
// Write your codes...
});
}
上面嘅code就係一個例子。當瀏覽器準備去第二個網頁嘅時候,browser.findElements()就有可能會先過瀏覽器一步,喺網頁仲未開始load入去嗰陣就搵相關嘅元素。結果除咗可以係文章一開始張圖外,仲有可能係因為搵唔到元素而做成嘅TimeoutError。
咁應該點算好?其實最主要係俾瀏覽器有時間可以將網頁載入。我有試過用browser.wait(webdriver.until.elementsLocated('element'), 5000),但好似無乜成效。最後我用咗最直接嘅方法:sleep()。
for (let key in array) {
await browser.get(array[key]['url']).then(async () => {
await browser.sleep(1000); // Make browser sleep for a while to ensure the page is loaded.
let boxes = await browser.findElements(By.css('.boxes'));
// Write your code here...
});
}
await browser.get(array[key]['url']).then(async () => {
await browser.sleep(1000); // Make browser sleep for a while to ensure the page is loaded.
let boxes = await browser.findElements(By.css('.boxes'));
// Write your code here...
});
}
當每次瀏覽器跳去新網址嗰陣,就俾佢停止運作一陣,等網頁可以有充足時間可以載入。咁樣嘅話,就可以避免因為搵唔到相關元素而導致嘅StaleElementReferenceError同TimeoutError嘅問題。
Selenium系列: