Усовершенствованные устаревшие элементы
Я читал об устаревших элементах и все еще немного сбит с толку. Например, следующее не будет работать, правильно?
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