StaleElementReferenceError - Selenium Webdriver常見問題之一 (上)


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...
    });
}

上面嘅code就係一個例子。當瀏覽器準備去第二個網頁嘅時候,browser.findElements()就有可能會先過瀏覽器一步,喺網頁仲未開始load入去嗰陣就搵相關嘅元素。結果除咗可以係文章一開始張圖外,仲有可能係因為搵唔到元素而做成嘅TimeoutError。

TimeoutError。最常出現嘅原因係網頁未載入完就已經進行模擬操作導致Conditional Rendering失敗。

咁應該點算好?其實最主要係俾瀏覽器有時間可以將網頁載入。我有試過用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...
    });
}

當每次瀏覽器跳去新網址嗰陣,就俾佢停止運作一陣,等網頁可以有充足時間可以載入。咁樣嘅話,就可以避免因為搵唔到相關元素而導致嘅StaleElementReferenceError同TimeoutError嘅問題。


Selenium系列:

Powered by Half-moon Production.

Copyright © 2011-2020 by 泣雨家的雜物房. Version 1.5.2.

StaleElementReferenceError - Selenium Webdriver常見問題之一 (上)


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...
    });
}

上面嘅code就係一個例子。當瀏覽器準備去第二個網頁嘅時候,browser.findElements()就有可能會先過瀏覽器一步,喺網頁仲未開始load入去嗰陣就搵相關嘅元素。結果除咗可以係文章一開始張圖外,仲有可能係因為搵唔到元素而做成嘅TimeoutError。

TimeoutError。最常出現嘅原因係網頁未載入完就已經進行模擬操作導致Conditional Rendering失敗。

咁應該點算好?其實最主要係俾瀏覽器有時間可以將網頁載入。我有試過用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...
    });
}

當每次瀏覽器跳去新網址嗰陣,就俾佢停止運作一陣,等網頁可以有充足時間可以載入。咁樣嘅話,就可以避免因為搵唔到相關元素而導致嘅StaleElementReferenceError同TimeoutError嘅問題。


Selenium系列: