调试StaleElementReference异常 - Selenium WebDriver

时间:2016-05-31 15:37:33

标签: java selenium selenium-webdriver exception-handling staledataexception

我在这里遇到某种情况。

我有一个函数editNewUser()。

public void editNewUser() throws Exception
    {
        driver.findElement(adminModuleDD).click();
        wait.until(ExpectedConditions.visibilityOfElementLocated(searchRes));
        List<WebElement> elements = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(uNames));
        for(WebElement el : elements)
        {
            if(el.getText().equals(UserName))
            {
                el.click();
                wait.until(ExpectedConditions.visibilityOfElementLocated(editUserHeading));
                driver.findElement(editUser).click();
                WebElement status_Dropdown = driver.findElement(By.xpath("//select[@id='systemUser_status']"));
                Select status = new Select(status_Dropdown);
                status.selectByVisibleText("Enabled");
            }
        }   
    }

UserName是一个公共字符串变量,在创建用户期间在另一个函数中获取值。

在这个脚本中,我导航到一个包含用户列表的页面,我将所有用户名存储在List'elements'中,然后迭代列表中与文本匹配的每个元素。

现在,在我的test_run脚本中,我在editNewUser()之后调用了一些其他方法。

事情发生的是,此方法在if block中执行以下命令。

if(el.getText().equals(UserName))
    {
        el.click();
        wait.until(ExpectedConditions.visibilityOfElementLocated(editUserHeading));
        driver.findElement(editUser).click();
        WebElement status_Dropdown = driver.findElement(By.xpath("//select[@id='systemUser_status']"));
        Select status = new Select(status_Dropdown);
        status.selectByVisibleText("Enabled");
    }

但是一旦调用了下一个方法,它就会停止执行并抛出org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up

堆栈跟踪指的是行if(el.getText().equals(UserName))

你能告诉我为什么我收到这个异常,虽然if块中的命令被执行了。

1 个答案:

答案 0 :(得分:0)

错误消息告诉您问题。编辑第一个&#34; el&#34;在你的for循环中,页面已经更新,因此Selenium已经忘记了&#34;元素中的剩余元素&#34;列表。

您需要找到另一种方法来跟踪您正在循环的元素。我过去使用的一种技术是创建一个自定义对象来表示项目,在您的情况下可能是&#34; User&#34;。该对象足够聪明,可以在页面上重新找到自己。