Как работать - Элемент не найден в кэше - возможно, страница изменилась с тех пор, как она была найдена в тестах Java Selenium WebDriver

1

Это HTML-код для отображения значка удаления в таблице, и мне нужно щелкнуть по символу, чтобы удалить данные из таблицы, но его идентификатор меняется для каждой динамической строки таблицы, поэтому не может использовать идентификатор в коде Java Selenium. Я использовал имя className но он также не работает.

HTML

<a href="#">
    <img id="489" class="delete" width="16" height="16" title="Delete Project" alt="Delete Project" src="../media/internalnotforuse/images/icons/del.png"></img>
</a>

Код

if (projectName.equals("Test")) {
    System.out.println("Table Data : " + projectName);
    System.out.println("Table Row " + rowCount);

    rowCells.get(4).click(); // it is working fine
    webdriver.findElement(By.className("delete")).click();

    // webdriver.findElement(By.id("493")).click(); 
    //it is working fine but it hard coded 

    for(String winHandle : sWindowHandles){
        webdriver.switchTo().window(winHandle);
    }

    // confirm the confirmation from dialog option Yes/NO
    if(deleteConfirmaton == "Yes"){
        webdriver.findElement(By.xpath("//*[@id='deleteError_confirm']/table/tbody/tr[2]/td/input[1]")).click();

        //webdriver.findElement(By.xpath("//*[@id='projectList']/tbody/tr[76]/td[1]")).click();     
    }
    else{
        webdriver.findElement(By.xpath("//*[@id='deleteError_confirm']/table/tbody/tr[2]/td/input[2]")).click();
        System.out.println(" deleteConfirmaton is NO therefore would not be deleted " );
    }
}

Вывод

FAILED: projectDelete
org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up
Command duration or timeout: 20.07 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.37.0', revision: 'a7c61cb', time: '2013-10-18 17:15:02'
System info: host: 'TSSGMSL058', ip: '10.56.40.179', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_51'
Session ID: 9a41792f-ea05-4904-ad03-6b80396e5ccd
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=XP, databaseEnabled=true, cssSelectorsEnabled=true, javascriptEnabled=true, acceptSslCerts=true, handlesAlerts=true, browserName=firefox, browserConnectionEnabled=true, nativeEvents=true, webStorageEnabled=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=27.0.1}]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  • 0
    rowCells.get(4).click(); : Эта строка кода обновляет страницу?
Теги:
selenium
selenium-webdriver
webdriver

2 ответа

2

StaleElementReferenceException указывает, что, поскольку вы нашли элемент, HTML-код страницы был обновлен загрузкой страницы или JavaScript, и поэтому может быть устаревшим. Это верно, даже если наш объект все еще можно найти в обновленном HTML.

Тем не менее, ваш случай выглядит немного странным, поскольку он, похоже, не кэширует какие-либо объекты.

Мне интересно, есть ли несколько элементов с одним классом, первый из которых быстро затухает? Очень маловероятно, но без просмотра всей трассировки стека с номерами строк трудно сказать.

Однако вы можете попробовать использовать селектор CSS, такой как;

By.Css("img.delete[id]")

Это приведет к извлечению всего IMG с классом удаления и заполнением id. Вы могли пойти дальше;

By.Css("img.delete[id][src$='del.png']")

Это добавляет еще одну проверку, что изображение src заканчивается del.png.

Можете ли вы попробовать эти или, по крайней мере, предоставить точную информацию о строке, которая является ошибкой и полной трассировкой стека?

  • 0
    Это удаляет первый raw вместо определенной строки. Работает нормально только для первой строки в таблице.
  • 0
    Извините, я до сих пор не до конца понимаю вашу проблему. Можете ли вы опубликовать трассировку стека
-1

Вот друзья решений, просто добавьте разрытие оператора ; или продолжать; как последний оператор в цикле for в соответствии с вашей логикой. Он удалит ошибку, и код будет работать нормально. Я изменяю код, как показано ниже...

if (projectName.equals("Test")) {
    System.out.println("Table Data : " + projectName);
    System.out.println("Table Row " + rowCount);

    rowCells.get(4).click(); // it is working fine
    webdriver.findElement(By.className("delete")).click();

    // webdriver.findElement(By.id("493")).click(); 
    //it is working fine but it hard coded 

    for(String winHandle : sWindowHandles){
        webdriver.switchTo().window(winHandle);
        break; //or continue;
    }

    // confirm the confirmation from dialog option Yes/NO
    if(deleteConfirmaton == "Yes"){
        webdriver.findElement(By.xpath("//*[@id='deleteError_confirm']/table/tbody/tr[2]/td/input[1]")).click();

        //webdriver.findElement(By.xpath("//*[@id='projectList']/tbody/tr[76]/td[1]")).click();     
    }
    else{
        webdriver.findElement(By.xpath("//*[@id='deleteError_confirm']/table/tbody/tr[2]/td/input[2]")).click();
        System.out.println(" deleteConfirmaton is NO therefore would not be deleted " );
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню