Селен и Java: пока l oop работает не так, как ожидалось - PullRequest
0 голосов
/ 09 марта 2020

У меня есть проблема с автоматизацией действия щелчка, и я изо всех сил пытаюсь понять, что не так с логикой c в моем решении.

Моя задача состоит в том, что мне нужно нажать один из нескольких разные радиокнопки.

Каждая радиокнопка имеет идентификатор "r" + a_number.

Я не знаю, для какого-либо данного теста, какие здесь доступны опции "r" + a_number будет, поэтому я написал это, пока l oop, который предназначен для нажатия первой доступной радиокнопки:

int counter = 0;

while(true) {
    counter++;
    try {
        driver.findElement(By.id("r" + counter)).click();
    } catch (NoSuchElementException e) {
        continue;
    }

    break;

}

Это не работает, как задумано - кто-то может помочь мне понять, в чем дело?

Примечание: я новичок с Java

Обновление

Моя цель - щелкнуть первое существующее радио кнопка, так что пока l oop увеличивает счетчик var, скажем, r = 1, затем пытается щелкнуть переключатель с идентификатором «r1». Если такого элемента с идентификатором «r1» не существует, генерируется исключение NoSuchElementException, и в этом случае текущая итерация l oop должна остановиться и начать следующую итерацию (r = 2, попробуйте щелкнуть элемент «r2», если не существует, начинайте следующий, пока l oop цикл).

Предположим, мы добрались до элемента "r20", и этот элемент действительно существует, затем нужно нажать кнопку, исключение не выдается, и поэтому в то время как l oop продолжается и выполняет команду прерывания, а l oop завершается.

Однако текущее поведение заключается в том, что исключение не обрабатывается, даже если элемент не существует, пока l oop завершается, но ничего не было нажато.

Ответы [ 3 ]

1 голос
/ 10 марта 2020

Есть две проблемы с кодом:

  1. L oop выполняется только один раз - Вы нарушаете l oop, используя оператор break, после самой первой итерации .

  2. Нет сгенерированного исключения - Вы не регистрируете исключение. Вы выполняете только оператор continue в блоке catch. Вы не нуждаетесь в операторе, потому что l oop все равно будет go до следующей итерации (задолго до того, как вы удалите оператор break).

Вам следует использовать этот код:

int counter = 0;
boolean foundElement = false;
while(!foundElement) {
    counter++;
    try {
        driver.findElement(By.id("r" + counter)).click();
        foundElement = true;
    } catch (NoSuchElementException e) {
       //assuming you want to log exception. Otherwise you can leave the catch block empty.
       System.out.println(e);     
    }
}
0 голосов
/ 09 марта 2020

Не уверен, и, возможно, потребуется немного больше информации, однако, я бы сделал это немного по-другому

int counter = 0;
boolean ifNotFound = true;
while(ifNotFound) {
counter++;
try {
    driver.findElement(By.id("r" + counter)).click();
    ifNotFound = false;
  } catch (NoSuchElementException e) {
    System.out.println("exception caught");
  }
}

Я просто пытаюсь щелкнуть мышью, и в случае успеха установит значение l oop в значение false и это сломается. Может случиться так, что исключение, которое вы ловите, не генерируется, поэтому вы можете попытаться изменить его на generi c Exception, и если это сработает, вы можете поймать больше спецификаций c один или несколько если вам нужно.

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

Пожалуйста, используйте это:

int counter = 0;

while(true) {
    counter++;
    boolean elementFound = false;
    try {
        driver.findElement(By.id("r" + counter)).click();
        elementFound = true;
    } catch (NoSuchElementException e) {
        continue;
    }

    if (elementFound){
       break;
    }

}
...