(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);
}

Надеюсь, это поможет вам. Спасибо

Другие вопросы по тегам