TimeoutException при нажатии на элемент, который уже присутствует на странице - PullRequest
0 голосов
/ 31 марта 2020

Вот мой первый класс 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

1 Ответ

0 голосов
/ 31 марта 2020

Вы пытаетесь нажать на элемент, поэтому, если вы обновите свои решения до elementToBeClickable вместо visibilityOfElementLocated. visibilityOfElementLocated не гарантирует кликабельность.

waitFor(ExpectedConditions.elementToBeClickable(locator),
                (timeOutInSeconds.length > 0 ? timeOutInSeconds[0] : null));

Также, если она не работает, попробуйте увеличить время ожидания с 10 to 20.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...