Я получаю StaleElementReferenceException: элемент не прикреплен к документу страницы
я получаю StaleElementReferenceException
: элемент не прикреплен к документу страницы. Я рассмотрел некоторые решения, которые уже есть в Stackru. Не сработало и продолжает выкидывать ту же ошибку. Вот код, который я использую, который выбрасывает устаревшую ссылку
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 ответа
Поскольку щелчок по найденной ячейке приводит к некоторым изменениям HTML на текущей странице, из-за этих изменений селен будет рассматривать страницу (после щелчка) как "новую" страницу (даже если на самом деле не перенаправляет на другую страницу).
В следующей итерации цикла цикл все еще ссылается на элемент, принадлежащий "предыдущей" странице, это является основной причиной исключения "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"));
}
}
}
Если вы используете 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);
}
}
Используйте "перерыв" после нажатия на найденный элемент. Исключение происходит потому, что после нажатия на ваш элемент цикл продолжается.
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;
}
}
}