Java 在测试ajax时,是否可以刷新Selenium中的Select对象

Java 在测试ajax时,是否可以刷新Selenium中的Select对象,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,当我在进行selenium测试时,我在网站上测试一些ajax功能时遇到了一个问题。我在线程“main”org.openqa.selenium.StaleElementReferenceException:元素不再附加到DOM中时遇到错误异常 在查找了大量内容之后,我知道我之所以会出现此错误,是因为我在第一个select对象中访问的元素被考虑在内,因为ajax重新加载了站点的该部分 为了避免这个异常,我每次都创建了一个新的select对象。重新加载页面时,xpath不会更改 是否可以使用对象的新x

当我在进行selenium测试时,我在网站上测试一些ajax功能时遇到了一个问题。我在线程“main”org.openqa.selenium.StaleElementReferenceException:元素不再附加到DOM中时遇到错误
异常

在查找了大量内容之后,我知道我之所以会出现此错误,是因为我在第一个select对象中访问的元素被考虑在内,因为ajax重新加载了站点的该部分

为了避免这个异常,我每次都创建了一个新的select对象。重新加载页面时,xpath不会更改

是否可以使用对象的新xpath刷新Select,而不是每次创建一个新的xpath

谢谢你的帮助

public static boolean ajaxFunctionalityFF() throws InterruptedException {

    int rowCount=driver.findElements(By.xpath("//table[@class='classname']/tbody/tr")).size();
    rowSizes.add(rowCount);
    Select ajaxSelector = new Select(driver.findElement(By.id("edit-term")));


    ajaxSelector.selectByVisibleText("-Beef);
    Thread.sleep(4000);
    rowCount=driver.findElements(By.xpath("//table[@class='classname']/tbody/tr")).size();
    rowSizes.add(rowCount);
    totalElements = totalElements + rowCount;

    Select ajaxSelector2 = new Select(driver.findElement(By.id("edit-term"))); //create a new one to fix the stale element exception
    ajaxSelector2.selectByVisibleText("-Cattle");
    Thread.sleep(4000);
    rowCount=driver.findElements(By.xpath("//table[@class='classname']/tbody/tr")).size();

每次刷新HTML的该部分时,您都需要获取它。我会做类似的事情

private By selectLocator = By.id("edit-term");
public static boolean ajaxFunctionalityFF() throws InterruptedException
{
    ...
    Select ajaxSelector = getSelect();
    ...
    ajaxSelector = getSelect();
    ajaxSelector.selectByVisibleText("-Cattle");
    ...
}
public static Select getSelect()
{
    return new Select(driver.findElement(selectLocator));
}

我通常在这种情况下使用的一种解决方法如下:

do
{
try
{
    WebElement element=FindThatElement;
    element.performSomeAction();
    break;
}
catch(StaleElementException | //Any Other unExpectedException e)
{
    //continue do while loop;
}
} while(1>0);

您是否尝试过显式/流畅地等待并查看是否可以使用相同的select元素?另外,当你说页面部分正在刷新时,是否意味着你的select元素也在刷新?不是显式的/fluent等待,但我确实在整个方法中使用了
Thread.Sleep()
只是看看状态是否会有任何变化。select元素正在刷新,因为它填充了一个新值,但仍然是相同的xpath。这是一个下拉列表,
selectByVisibleText
只是在其中选择了不同的选项。然后,在选择第一个选项后,您可能应该尝试使用fluent waits等待元素。试试这个-
WebDriverWait wait=newwebdriverwait(driver,20);wait.till(ExpectedConditions.presenceOfElementLocated(By.id(“编辑术语”)))。如果仍然不起作用,请告诉我。另请检查。将ajaxSelector2原因替换为fluent wait会导致与之前相同的错误,即引用过时。谢谢,如果再次发生,请务必记住。