Продолжить, если элемент не найден, если найден, сохранить его - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть цикл, в котором я открываю ссылки одну за другой. Внутри этого цикла у меня есть оператор if, который проверяет:

  1. Если я вижу имя, то я копирую его
  2. Если я не вижу имени, тогда я игнорируюэто и продолжить цикл.

    List<WebElement> demovar = driver.findElements(By.xpath("//*[@id=\"big_icon_view\"]/ul/li/p/a"));
    System.out.println(demovar.size());
    ArrayList<String> hrefs = new ArrayList<String>(); 
    for (WebElement var : demovar) {
        System.out.println(var.getText());
        System.out.println(var.getAttribute("href"));
        hrefs.add(var.getAttribute("href"));
    }
    
    int i = 0;
    for (String href : hrefs) {
        driver.navigate().to(href);
        System.out.println((++i) + ": navigated to URL with href: " + href);
        if(driver.findElement(By.xpath("//a[@id='name']")).isDisplayed()) {
            System.out.println("I can see Name");
        } else {
            System.out.println("I cant see Name");
        }
        Thread.sleep(3000); // To check if the navigation is happening properly.
    }
    

Почему это не работает должным образом? Как я предполагаю, он должен иметь следующее:

  1. Если элемент отображается, то я вижу Имя
  2. , иначе элемент НЕ отображается, тогда я не вижу Имя.

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

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

Вы можете поймать NoSuchElementException, чтобы обработать случай, когда элемент не появляется на странице.

 for (String href : hrefs) {
    driver.navigate().to(href);
    System.out.println((++i) + ": navigated to URL with href: " + href);
    // create isDisplayed variable
    boolean isDisplayed = true;
    try {
        isDisplayed = driver.findElement(By.xpath("//a[@id='name']")).isDisplayed();
        }
    catch(NoSuchElementException) {
            isDisplayed = false;
        }
        // do something else here with isDisplayed
        if (isDisplayed) { System.out.println("I can see Name"); }
        else { System.out.println("I can not see Name"); }
}

Этот код делает почти то же самое, что и ваш, но мы ловим NoSuchElementException который выдается, если элемент не появляется на странице.

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

0 голосов
/ 11 ноября 2019

После помощи @Christine, я сделал решение для меня

for (String href : hrefs) {
            driver.navigate().to(href);
            boolean isPresent = driver.findElements(By.xpath("element")).size() > 0;
            if (isPresent) {
                String test = driver.findElement(By.xpath("element")).getText();
                System.out.println(test);
            } else {
                System.out.println("Name not found");
            }
            Thread.sleep(3000); // To check if the navigation is happening properly.
        }
    }
}

И это работает нормально =)

0 голосов
/ 08 ноября 2019

API findElement (By by) в интерфейсе WebDriver сообщает следующее:

"Найти первый WebElement с использованием данного метода. Этот метод зависит от времени" неявного ожидания ", действующего в данный моментВыполнение findElement (..) возвращает соответствующую строку или повторяет попытку несколько раз, пока не будет достигнуто настроенное время ожидания. findElement не должен использоваться для поиска отсутствующих элементов, использования findElements (By) и подтверждения ответа нулевой длинывместо этого. "

Это означает, что в случае, если элемент не найден, он продолжает пытаться до настроенного тайм-аута и выдает исключение NoSuchElementException - Если не найдено соответствующих элементов

Следовательно, было бы лучшеобрабатывать следующими способами

  1. Использование FindElements, которое возвращает список всех веб-элементов, или пустой список, если ничто не соответствует следующим образом:

    if(driver.findElements(By.ByXPath).size()<0)

  2. Использование try / catch / finally для перехвата NoSuchElementException и логического значенияфлаг, чтобы определить, присутствует ли он или нет. Логический флаг может быть установлен в ложь в случае, если исключение поймано.

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