Вот мой первый класс UserPage. Здесь вы можете увидеть метод ClickNextPage (), который вызывает метод click из класса BasePageObject
public class UserPage extends BasePageObject {
private String buttonNextPage = "//button[contains(@aria-label, 'Next page')]";
public UserPage(WebDriver driver, Logger log) {
super(driver, log);
}
public UserPage ClickNextPage() {
click(By.xpath(buttonNextPage));
return this;
}
}
В классе BasePageObject есть следующие методы
Метод click () вызывает методы WaitForVisibilityOf и find ()
Метод WaiforVisibility вызовов waitFor метода
public class BasePageObject {
protected WebDriver driver;
protected Logger log;
protected String iconXpath = ".//mat-icon[@aria-label='%s']";
public BasePageObject (WebDriver driver, Logger log){
this.driver = driver;
this.log = log;
}
protected void click(By locator) {
waitForVisibilityOf(locator, 10);
find(locator).click();
}
protected WebElement find(By locator){
return driver.findElement(locator);
}
/**
* Wait for specific ExpectedCondition for the given amount of time in seconds
*/
private void waitFor(ExpectedCondition<WebElement> condition, Integer timeOutInSeconds) {
timeOutInSeconds = timeOutInSeconds != null ? timeOutInSeconds : 30;
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(condition);
}
/**
* Wait for given number of seconds for element with given locator to be visible
* on the page
*/
protected void waitForVisibilityOf(By locator, Integer... timeOutInSeconds) {
int attempts = 0;
while (attempts < 2) {
try {
waitFor(ExpectedConditions.visibilityOfElementLocated(locator),
(timeOutInSeconds.length > 0 ? timeOutInSeconds[0] : null));
break;
} catch (StaleElementReferenceException e) {
}
attempts++;
}
}
И теперь я использую эти методы в своем тесте
@org.testng.annotations.Test()
public void login() {
MainPage mainPage = new MainPage(driver,log);
mainPage.openPage();
UserPage userPage = mainPage.login(login, password);
userPage.ClickNextPage();
Но я получаю ошибку
TimeoutException: Expected condition failed: waiting for presence of element located by: By.xpath: //button[contains(@aria-label, 'Next page')]
at dtapi.pages.BasePageObject.waitFor(BasePageObject.java:120)
at dtapi.pages.BasePageObject.waitForVisibilityOf(BasePageObject.java:131)
at dtapi.pages.BasePageObject.click(BasePageObject.java:99)
at dtapi.pages.UserPage.ClickNextPage(UserPage.java:27)
at dtapiLoginTest.LoginPageTests.login(LoginPageTests.java:33)
Я должен признать, что элемент видим и присутствует
Обновление
Я внес некоторые изменения, и теперь он работает
public class UserPage extends BasePageObject {
private String buttonNextPage = "//button[@class='mat-paginator-navigation-next mat-icon-button mat-button-base']";
public UserPage(WebDriver driver, Logger log) {
super(driver, log);
}
public void ClickNextPage() {
WebElement butNexPage = find(By.xpath(buttonNextPage));
butNexPage.click();
}
}
Но когда я использую этот xpath, он не работает
private String buttonNextPage = "//button[@aria-label='Next page']";
Error
NoSuchElementException
at dtapi.pages.BasePageObject.find(BasePageObject.java:95)
at dtapi.pages.UserPage.ClickNextPage(UserPage.java:30)
at dtapiLoginTest.LoginPageTests.login(LoginPageTests.java:33)
Я хочу использовать этот xpath, потому что я смогу изменить метку aria в методе, когда мне это понадобится
![xpath](https://i.stack.imgur.com/F7qUf.png)