Усовершенствованные устаревшие элементы

Я читал об устаревших элементах и ​​все еще немного сбит с толку. Например, следующее не будет работать, правильно?

 public void clickFoo(WebElement ele) {
    try {
      ele.click();
    } catch (StaleElementReferenceException ex) {
      ele.click();
    }
 }

потому что, если ele устарел, он останется устаревшим. Лучше всего переделать driver.findElement(By), но, как видно из этого примера, xpath отсутствует. Вы можете попытаться использовать ele.getAttribute("id") и использовать его, но если у элемента нет идентификатора, это также не будет работать. Все методы, вызывающие это, должны были бы использовать try/catch, что может оказаться невозможным.

Есть ли какой-то другой способ вернуть элемент? Кроме того, предполагая, что есть идентификатор, идентификатор останется тем же самым после того, как элемент устареет? Чем отличается объект WebElement ele после того, как он устарел?

(Java Eclipse)

1 ответ

Решение

Я бы порекомендовал вам НЕ создавать метод, как указано выше. Нет необходимости добавлять еще один функциональный слой поверх .click(), Просто позвони .click() на самом элементе.

driver.findElement(By.id("test-id")).click();

или же

WebElement e = driver.findElement(By.id("test-id"));
e.click();

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

Объект страницы для домашней страницы.

public class HomePage
{
    private WebDriver driver;
    public WebElement staleElement;
    private By waitForLocator = By.id("sampleId");

    // please put the variable declarations in alphabetical order
    private By sampleElementLocator = By.id("sampleId");

    public HomePage(WebDriver driver)
    {
        this.driver = driver;
        // wait for page to finish loading
        new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(waitForLocator));

        // see if we're on the right page
        if (!driver.getCurrentUrl().contains("samplePage.jsp"))
        {
            throw new IllegalStateException("This is not the XXXX Sample page. Current URL: " + driver.getCurrentUrl());
        }
    }

    public void clickSampleElement()
    {
        // sample method code goes here
        driver.findElement(sampleElementLocator).click();
    }
}

Использовать его

WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.example.com");
HomePage homePage = new HomePage(driver);
homePage.clickSampleElement();
// do stuff that changes the page and makes the element stale
homePage.clickSampleElement();

Теперь мне больше не нужно полагаться на старую ссылку. Я просто снова вызываю метод, и он делает всю работу за меня.

Существует множество ссылок на объектную модель страницы. Вот один из вики Selenium. http://www.seleniumhq.org/docs/06_test_design_considerations.jsp

Если вы хотите прочитать больше информации о том, что является устаревшим элементом, у документов есть хорошее объяснение. http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp

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