我收到StaleElementReferenceException:元素没有附加到页面文档

时间:2018-03-08 12:22:22

标签: java selenium selenium-webdriver staleelementreferenceexception

HTMLCODE

我收到StaleElementReferenceException:元素未附加到页面文档。我浏览了StackOverflow中已有的一些解决方案。它没有工作,它继续抛出相同的错误。这是我正在使用的代码,它抛出过时的引用错误

WebElement table2 = driver.findElement(By.cssSelector("body > div:nth-child(74) > div.sp-palette-container"));
List<WebElement> allrows2 = table2.findElements(By.tagName("div"));

    for(WebElement row2: allrows2){
        List<WebElement> cells = row2.findElements(By.tagName("span"));
        for(WebElement cell:cells){
                if (cell.getAttribute("title").equals("rgb(0, 158, 236)")) {
                cell.click(); 

                }          
          }
    } 

3 个答案:

答案 0 :(得分:1)

因为点击找到的单元格导致当前页面上的一些HTML更改,由于此更改,selenium会将页面(点击后)视为“新”页面(即使实际上没有重定向到另一个页面)。

在循环的下一次迭代中,循环仍然引用元素属于“previous”页面,这是“StateElementReference”异常的根本原因。

因此,您需要在“新”页面上再次找到这些元素,以更改元素的引用来自“新”页面。

WebElement table2 = driver.findElement(By.cssSelector("body > div:nth-child(74) > div.sp-palette-container"));
List<WebElement> allrows2 = table2.findElements(By.tagName("div"));

int rowSize, cellSize = 0;
rowSize = allrows2.sie();

for(int rowIndex=0;rowIndex<rowSize;rowIndex++){
    WebElement row2 = allrows2.get(rowIndex);
    List<WebElement> cells = row2.findElements(By.tagName("span"));
    cellSize = cells.size();

    for(int cellIndex=0;cellIndex<cellSize;cellIndex++){
        WebElement cell = cells.get(cellIndex);

        if (cell.getAttribute("title").equals("rgb(0, 158, 236)")) {
            cell.click();
            // find cells again on "new" page
            cells = row2.findElements(By.tagName("span"));
             // find rows again on "new" page
            allrows2 = table2.findElements(By.tagName("div"));
        }
    }
}

答案 1 :(得分:1)

如果您的用例标题的元素click() rgb(0,158,236),则可以使用以下代码块:

    String baseURL = driver.getCurrentUrl();
    List<WebElement> total_cells = driver.findElements(By.xpath("//div[@class='sp-palette-container']//div//span"));
    int size = total_cells.size();
    for(int i=0;i<size;i++)
    {
        List<WebElement> cells = driver.findElements(By.xpath("//div[@class='sp-palette-container']//div//span"));
        if (cells.get(i).getAttribute("title").contains("rgb(0, 158, 236)")) 
        {
            cells.get(i).click(); 
            //do your other tasks
            driver.get(baseURL);
        }
    } 

答案 2 :(得分:1)

单击找到的元素后使用“break”。发生异常是因为在单击元素后,循环继续。

WebElement table2 = driver.findElement(By.cssSelector("body > div:nth-child(74) > div.sp-palette-container"));
List<WebElement> allrows2 = table2.findElements(By.tagName("div"));

    for(WebElement row2: allrows2){
        List<WebElement> cells = row2.findElements(By.tagName("span"));
        for(WebElement cell:cells){
                if (cell.getAttribute("title").equals("rgb(0, 158, 236)")) {
                cell.click(); 
                break;
                }          
          }
    }