2017-02-14 6 views
1

В тестовом окне моего webdriver мне нужно разобрать номер из URL-адреса (и проверить сбой, если его там нет), но сначала подождите, пока я перенаправлен на URL-адрес, содержащий число. Например, когда я иду на «локальном/# createRecord» Я перенаправлен на «локальном/# editRecord/какой-номер»Лучший способ избежать дополнительной работы с пользовательским предикатом WebDriver

wait.until(ExpectedConditions.urlMatches("#editRecord/([0-9]*)$")); 
    String url = driver.getCurrentUrl(); 
    Pattern p = Pattern.compile("#editRecord/([0-9]*)$"); 
    Matcher m = p.matcher(url); 

    int newStudentId=0; 
    if (m.find()) { 
     newStudentId = Integer.parseInt(m.group(1)); 
     System.out.println(m.group(1)); // The matched substring 
    } else fail("There is no ID number in #editRecord page"); 

В этом случае на самом деле дополнительное согласование работа происходит после того, как ждать. пока (...) После некоторого поиска я пришел к этой вариации кода. Это экономит разборе результат, как только это успешно:

Pattern p = Pattern.compile("#editRecord/([0-9]*)$"); 
    final int[] newStudentId = new int[1]; //declared like this because otherwise we won't be able to assign value to it from lambda expression 
    try { 
     wait.until((WebDriver driver) -> { 
      String url = driver.getCurrentUrl(); 
      Matcher m = p.matcher(url); 
      if (m.find()) { 
       newStudentId[0] = Integer.parseInt(m.group(1)); 
       return true; 
      } else return false; 
     }); 
    } catch (org.openqa.selenium.TimeoutException e) { 
     fail("There is no ID number in #editRecord page or we haven't been redirected to #editRecord page"); 
    } 
    System.out.println(newStudentId[0]); 

Обе версии работают, но я не уверен, какой из них лучше использовать с точки зрения читаемости (я не использовать лямбды до и не понимаю полностью) и надежность. Кроме того, ловя исключение тайма-аута во втором варианте своего рода охватывает больше случаев терпят неудачу, что первый один

+0

Почему вы используете массив для 'newStudentId'?Если вы этого не сделаете, какая ошибка вы получите? –

+0

@ GrzegorzGórkiewicz есть комментарий в фрагменте кода с объяснением –

+0

Конечно, я его видел, но все равно не понимаю. –

ответ

0

Если вы часто ждать URL, чтобы изменить, вы можете написать свой собственный метод и использовать его несколько раз:

public void waitForUrlChange(final WebDriver driver, final String previousUrl, final int waitTime) { 
    WebDriverWait wait = new WebDriverWait(driver, waitTime); 
    wait.until((WebDriver d) -> !d.getCurrentUrl().equals(previousUrl)); 
} 

Или ждать URL, чтобы перейти к данному URL:

public void waitForUrlToEqual(final WebDriver driver, final String urlToEqual, final int waitTime) { 
    WebDriverWait wait = new WebDriverWait(driver, waitTime); 
    wait.until((WebDriver d) -> d.getCurrentUrl().equals(urlToEqual)); 
} 

Или ждать URL, чтобы соответствовать шаблону:

public void waitForUrlToMatch(final WebDriver driver, final String patternToMatch, final int waitTime) { 
    WebDriverWait wait = new WebDriverWait(driver, waitTime); 
    final Pattern pattern = Pattern.compile(patternToMatch); 
    wait.until((WebDriver d) -> { 
      Matcher matcher = pattern.matcher(d.getCurrentUrl()); 
      return matcher.find(); 
    }); 
} 

В этих методах часть после -> вызывается каждые 500 миллисекунд, пока она не будет оценена как true. Если это неверно в пределах waitTime, бросается TimeoutException.

Ваше первое решение ...

контрас:

  • Вы используете "#editRecord/([0-9]*)$" дважды. Вы должны объявить переменную String и использовать ее повторно.

Ваше второе решение ...
Плюсы:

  • Обработка исключений. Но это можно добавить к первому решению, просто сокрыв вызов wait.until с помощью блока try-catch.

контрас:

  • Вы должны объявить переменную final.

Если нет, я бы что-то немного более описательный, как это:

int newStudentId = 0; 
String urlPattern = "#editRecord/([0-9]*)$"; 
String failMessage = "There is no ID number in #editRecord page"; 
try { 
    wait.until(ExpectedConditions.urlMatches(urlPattern)); 
    String url = driver.getCurrentUrl(); 
    Pattern p = Pattern.compile(urlPattern); 
    Matcher m = p.matcher(url); 
    if (m.find()) { 
     newStudentId = Integer.parseInt(m.group(1)); 
     System.out.println(newStudentId); 
    } else { 
     throw new IndexOutOfBoundsException(failMessage); 
    } 
} catch (org.openqa.selenium.TimeoutException | IndexOutOfBoundsException e) { 
    fail(failMessage); 
} 

Кроме того, он выглядит ясным и еще одно слово:
спасибо за разъяснение с лямбды ... его заставил меня думать!