(StaleElementException:Selenium) Как мне справиться с этим?
Я впервые работаю над селеном в первый раз, и у меня тоже нет опыта работы с веб-технологиями.
Работая, я столкнулся с StaleElementException, когда я пытаюсь получить доступ к определенному объекту в DOM.
Следующий метод обрабатывает все задачи:
private void extract(WebDriver driver) {
try {
List<WebElement> rows = driver.findElements(By.xpath("//*[@id='gvSearchResults']/tbody/tr"));
for (WebElement row : rows) {
WebElement columns = row.findElement(By.xpath("./td[1]/a"));
if (assertAndVerifyElement(By.xpath("//*[@id='gvSearchResults']/tbody/tr/td[1]/a"))) {
columns.click();
}
List<WebElement> elements = driver
.findElements(By.xpath("//*[@id='ctl00_MainContent_pnlDetailsInd']/table/tbody/tr"));
for (WebElement element : elements) {
WebElement values = element.findElement(By.xpath("./td[1]"));
System.out.print(values.getText() + " ");
WebElement values2 = element.findElement(By.xpath("./td[2]"));
System.out.println(values2.getText());
}
if(assertAndVerifyElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']")))
driver.findElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']")).click();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Логика утверждения идет здесь:
public boolean assertAndVerifyElement(By element) throws InterruptedException {
boolean isPresent = false;
for (int i = 0; i < 5; i++) {
try {
if (driver.findElement(element) != null) {
isPresent = true;
break;
}
} catch (Exception e) {
// System.out.println(e.getLocalizedMessage());
Thread.sleep(1000);
}
}
Assert.assertTrue("\"" + element + "\" is not present.", isPresent);
return isPresent;
}
Я пробовал несколько решений, в которых предлагалось использовать ожидание ожидаемых условий, но ни одно из них не помогло.
Кроме того, было бы полезно, если бы вы указали на любые плохие методы проектирования, которые я мог бы использовать в приведенном выше примере.
2 ответа
StaleElementException возникает, когда рассматриваемый веб-элемент изменяется на DOM, и первоначальная ссылка на этот веб-элемент теряется.
Вы можете снова искать webelement
попробуй это
try:
element = self.find_element_by_class('')
element.click()
except StaleElementReferenceException:
element = self.find_element_by_class('')
element.click()
Я могу дать вам идею преодоления застоя.
Как правило, мы получим исключение Stale, если атрибуты элемента или что-то изменилось после запуска webelement. Например, в некоторых случаях, если пользователь пытается щелкнуть по тому же элементу на той же странице, но после обновления страницы, появляется исключение staleelement.
Чтобы преодолеть это, мы можем создать новый веб-элемент на случай, если страница будет изменена или обновлена. Ниже код может дать вам некоторое представление.
Пример:
webElement element = driver.findElement(by.xpath("//*[@id='Stackru']"));
element.click();
//page is refreshed
element.click();//This will obviously throw stale exception
Чтобы преодолеть это, мы можем сохранить xpath в некоторой строке и использовать его для создания нового веб-элемента.
String xpath = "//*[@id='Stackru']";
driver.findElement(by.xpath(xpath)).click();
//page has been refreshed. Now create a new element and work on it
driver.findElement(by.xpath(xpath)).click(); //This works
Другой пример:
for(int i = 0; i<5; i++)
{
String value = driver.findElement(by.xpath("//.....["+i+"]")).getText);
System.out.println(value);
}
Надеюсь, это поможет вам. Спасибо