Это 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)
StaleElementReferenceException
указывает, что, поскольку вы нашли элемент, HTML-код страницы был обновлен загрузкой страницы или JavaScript, и поэтому может быть устаревшим. Это верно, даже если наш объект все еще можно найти в обновленном HTML.
Тем не менее, ваш случай выглядит немного странным, поскольку он, похоже, не кэширует какие-либо объекты.
Мне интересно, есть ли несколько элементов с одним классом, первый из которых быстро затухает? Очень маловероятно, но без просмотра всей трассировки стека с номерами строк трудно сказать.
Однако вы можете попробовать использовать селектор CSS, такой как;
By.Css("img.delete[id]")
Это приведет к извлечению всего IMG с классом удаления и заполнением id. Вы могли пойти дальше;
By.Css("img.delete[id][src$='del.png']")
Это добавляет еще одну проверку, что изображение src заканчивается del.png.
Можете ли вы попробовать эти или, по крайней мере, предоставить точную информацию о строке, которая является ошибкой и полной трассировкой стека?
Вот друзья решений, просто добавьте разрытие оператора ; или продолжать; как последний оператор в цикле 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 " );
}
}
rowCells.get(4).click();
: Эта строка кода обновляет страницу?