Как повторить попытку некоторых методов через несколько секунд, а по истечении времени ожидания выбросить исключение метода, а не TimeoutException в селене? - PullRequest
0 голосов
/ 05 августа 2020

Я хочу создать элемент выбора, чтобы выбрать вариант. Но при загрузке страницы такой опции может не быть. Поскольку параметры загружаются из базы данных, API или чего-то, что имеет время ответа.

В настоящее время я использую selenium wait.until с логическим условием. Чтобы создать собственный метод ожидания.

Мой способ обхода:

                                                     .
                                                     .
                                                     .
String exceptionMessage;

public void myCode() throws Exception {
        exceptionMessage = "";
        Integer sec = 10;
        WebDriverWait wait = new WebDriverWait(shared.getBrowser(), Duration.ofSeconds(sec));
        try {
            wait.until(new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver d) {
                    try {
                                                     .
                                                     .
                                                     .

                        CommonMethods.selectOption(element, optionText);
                        return true;
                    } catch (Exception e) {
                        exceptionMessage = e.getMessage();
                        return false;
                    }
                }
            });
        } catch (TimeoutException e) {
            throw new Exception("Timeout: [" + sec + "] seconds, Exception message: [" + exceptionMessage + "]");
        }
}

Если таймаут, результат будет:

java.lang.Exception: Timeout: [10] seconds, Exception message: [element not visible: Element is not currently visible and may not be manipulated

Есть ли для этого какой-либо метод селена? Или способ получше?

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Я не думаю, что вам нужно столько, сколько у вас есть.

Мой c# лучше, чем мой java, но я бы использовал такую ​​структуру. Я запустил его в intellij, и, похоже, он работает, но у меня нет ваших действий и сайта, чтобы проверить его.

@Test
    public void myCode() throws Exception {
        exceptionMessage = "";
        Integer sec = 10;
        WebDriverWait wait = new WebDriverWait(driver, sec);
        try {
            wait.until((WebDriver dr) ->
            {
                    try {
                        //Your actions go here
                        //this one will always fail - comment it out to make it pass
                        dr.findElement(By.tagName("I will fail you!")).click();
                        return true;
                    } catch (Exception e) {
                        exceptionMessage = e.getMessage();
                        return false;
                    }

            });
        } catch (TimeoutException e) {
            throw new Exception("Timeout: [" + sec + "] seconds, Exception message: [" + exceptionMessage + "]");
        }
        System.out.println("The exception message is.... " + exceptionMessage);
    }

Я только что добавил очевидный сбойный элемент.

С этим раскомментированным:

 dr.findElement(By.tagName("I will fail you!")).click();

Возвращает строку перехвата ошибки тайм-аута. Я получаю:

java .lang.Exception: Тайм-аут: 1 секунд, сообщение об исключении: [такого элемента нет: невозможно найти элемент: {"метод": " css selector "," selector ":" I \ will \ fail \ you! "} (Информация о сеансе: chrome = 84.0.4147.105)

Если он закомментирован - он ничего не возвращает в сообщение об исключении (поэтому вернулось true, поэтому вернули проход):

intellij нет текста ошибки

0 голосов
/ 05 августа 2020
WebDriverWait wait = new WebDriverWait(driver,30);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(" xpath']")));        
      

Используйте уникальный Xpath для поиска элементов, поскольку там будут некоторые скрытые элементы.

Если вышеуказанное ожидание не сработает, вы также можете попробовать следующее:

new WebDriverWait(Driver,TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible("Yyour element path");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...