В настоящее время я работаю над фреймворком автоматизации с использованием java, selenium, selenium-grid, pageObject with pageFactory.
Я пытаюсь создать метод для тестирования следующего HTML-кода:
<section class="footer-links">
<div class="footer-layout">
<ul>
<li class="title">Header</li>
<li><a href="/home/">text</a></li>
<li><a href="/about/">text</a></li>
<li><a href="/games/">text</a></li>
<li><a href="/games/download/" >text</a></li>
<li><a href="/games/mobile/" >text</a></li>
<li><a href="/events/" >text</a></li>
</ul>
<ul>
<li class="title">Header</li>
<li><a href="/publishers/" >text</a></li>
<li><a href="/smth/" target="_blank" >text</a></li>
<li><a href="/promo/press/" >text</a></li>
</ul>
<ul>
<li class="title">Header</li>
<li><a href="/support/" >text</a></li>
<li><a href="/support/payment-inquiries/" class="loginModalShow" rel="nofollow" >text</a></li>
<li><a href="/support/general-inquiries/" >text</a></li>
<li><a href="/support/game-inquiries/" class="loginModalShow" rel="nofollow" >text</a></li>
</ul>
<ul>
<li class="title">Header</li>
<li><a href="/blog/" >text</a></li>
<li><a href="/search/" rel="nofollow" >text</a></li>
<li><a href="/directory/pc-games/" >text</a></li>
</ul>
</div>
Код выше представляет нижний колонтитул, содержащий 4 списка с некоторыми ссылками.
То, что я пытаюсь сделать с помощью следующего метода, - это перебирать один раз по 4 спискам и снова внутри каждого списка, щелкая ссылки и проверяя URL-адрес, на который они перенаправляются, со своим значением атрибута href.
@FindBy(css = ".footer-links .footer-layout ul")
public List<WebElement> footerLinksLists;
public void checkFooterLinks(){
if (footerLinksLists.size()==4){
for(int i=0; i<footerLinksLists.size(); i++){
List<WebElement> links = wait.until(ExpectedConditions.visibilityOfAllElements(footerLinksLists.get(i).findElements(By.cssSelector("li:not(:first-child)")))); // footerLinksLists.get(i).findElements(By.cssSelector("li:not(:first-child)"));
for (int j=0; j<links.size(); j++) {
WebElement link = wait.until(ExpectedConditions.elementToBeClickable(links.get(j).findElement(By.cssSelector("a"))));
String href = link.getAttribute("href");
link.click();
if(driver.getCurrentUrl().contains(href)){
log.info("Link " + href +" is ok");
}
driver.navigate().back();
}
}
}else{
log.info("the footer does not contain 4 link lists");
}
}
После запуска моего теста он прерывается после входа в цикл for со следующей ошибкой
org.openqa.selenium.StaleElementReferenceException: The element reference of <li> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed
В моем тестовом классе у меня есть следующий код для инициализации объекта страницы, содержащий метод:
WebDriver driver = driverFactory.getDriver();
WebDriverWait wait = driverFactory.getWait(driver);
homepagePageObject homePage = new homepagePageObject(driver, wait);
PageFactory.initElements(driver,homePage);
homePage.createAccount();
homePage.checkVerifyAccountRibbon();
homePage.signOut();
homePage.Login();
homePage.checkFooterLinks();
Первоначально я думал, что это как-то связано с ожиданием каждого элемента, но я получаю ту же ошибку после добавления условий ожидания / ожидаемого.
Может кто-нибудь объяснить, что я делаю не так и каково было бы лучшее решение в этом случае?