Как обработать сбой скрипта из-за времени отклика сервера в Selenium Webdriver? - PullRequest
2 голосов
/ 28 апреля 2020

Я новичок в Selenium Webdriver, я написал скрипт на Java для проверки работоспособности, и он работает нормально. Иногда я сталкиваюсь с проблемой.

Предположим, я просто нажимаю кнопку "Создать", чтобы создать что-то (пусть предположим, что клиент), и после этого мне нужно выполнить некоторую работу с экраном, который появляется после успешного создания клиента. Иногда из-за медленного ответа от сервера мой сценарий завершается ошибкой из-за поиска элемента DOM, который появляется после создания клиента.

Если в моем коде ответ приходит в заранее определенное время, нет проблем, если не пришел, то скрипт завершился неудачно (он ищет элемент, который еще не отображался).

1) нажмите на кнопку

try{
                    // let suppose creatButtonElement is the web element of Create Button.
                    createButtonElement.click();
                }catch(Exception e){
                    throw new Exception("Unable To Click on element [ " + element + " ] , plz see screenshot [ UnableToClick_" + element);
                }

Ожидается: после нажатия кнопки «Создать» мой сценарий ожидает сообщения об успешном подтверждении.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Я сталкивался с этой проблемой один раз, но я справился с этим вручную. Это будет работать, если после нажатия кнопки загрузчик появляется. Это ждет одну минуту. Пожалуйста, используйте следующий код, чтобы дождаться ответа сервера. Он проверяет видимость загрузчика, чтобы узнать ответ каждую секунду.

public static void loading_wait() throws Throwable {
            int i = 0;
            int maxloopDependOnBrowser = 60;
            int totalSecond=0;
            boolean loadinImageTakingMuchTime=false;
            try{
                  while (true) {
                        i++;
                        if( !(loaderDisplayed(APP_LoadingImage_xpath)) ){
                              totalSecond+=i;
                              break;
                        } 

                        if (i > maxloopDependOnBrowser) {
                              totalSecond=maxloopDependOnBrowser + 1;
                              loadinImageTakingMuchTime=true;
                              break;
                        } else {
                              totalSecond=i;
                              Thread.sleep(1000);
                        }
                  }
                  Thread.sleep(1000);

                  if(loadinImageTakingMuchTime){
                        throw new Throwable();
                  }

            }catch (Throwable t) {
                  throw new Exception("FAILED:>>> Loading image is taking too much time :>>"+Throwables.getStackTraceAsString(t));

            }
      }

XpathKey: - найти элемент загрузчика

public static boolean loaderDisplayed(String XpathKey) {
            int i = 0;
            try {
                  driver.manage().timeouts().implicitlyWait(5, TimeUnit.MILLISECONDS);    
                  List<WebElement> elementList = getORObject_list(XpathKey/*, 0, 500*/);
                  for (Iterator<WebElement> iterator = elementList.iterator(); iterator.hasNext();) {
                        WebElement webElement = (WebElement) iterator.next();
                        if (webElement.isDisplayed()) {
                              i = 1;
                              break;
                        }
                  }

            } catch (Throwable t) {
            }

            finally {
                driver.manage().timeouts().implicitlyWait(Long.parseLong(1), TimeUnit.SECONDS);
            }
            if (i == 0) {
                  return 
            } else {
                  return true;
            }

      }
1 голос
/ 29 апреля 2020

Вы можете присоединиться, ожидая

WebDriverWait wait = new NWebDriverWait(driver, 10); //10 second

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("btn1")));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("btn1")));
wait.until(ExpectedConditions.elementToBeClickable(By.id("btn1")));
...