Перейти к содержимому

Фотография

Selenium java не всегда срабатывает findElements

Selenium Java testing

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 dmitryberezin

dmitryberezin

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Березин Дмитрий

Отправлено 07 августа 2018 - 11:37

Здравствуйте!

 

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

 

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

 

while(true) {        

      driver.get("адрес сайта");

     number = driver.findElements(By.tagName("b"));   // записываем в список элементы с тегом b
     string = number.get(2).getText();                             // записываем в строку текст элемента с индексом 2

        if (string.trim().length() == 0) {                             // проверяем если строка пустая, то выводим в консоль ошибку

                    System.out.println("ошибка");
        } else{
                 System.out.println(string);                         // если же нет, то выводим в консоль строку
        }

           try {
             Thread.sleep(2000);                                     //останавливаем на 2 секунды
        } catch (Exception e){};

}

    Дело в том, что строка иногда остается пустой и в консоль выводится "ошибка", но в основном все работает как надо (в консоль выводится строка)

 

    То есть, 20 раз в консоль может вывестись строка как положено, а потом раз 5 ошибка, дальше все снова продолжает работать как нужно

    

    Буду благодарен если кто-нибудь поможет решить проблему.

 

 

 

 


  • 0

#2 Freiman

Freiman

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 591 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

Отправлено 07 августа 2018 - 13:01

наверно, первое, что можно сделать - вставить между открытием страницы и поиском элемента ожидание. Сейчас оно у вас почему-то в конце цикла и try/catch.
  • 0

#3 dmitryberezin

dmitryberezin

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Березин Дмитрий

Отправлено 07 августа 2018 - 13:51

наверно, первое, что можно сделать - вставить между открытием страницы и поиском элемента ожидание. Сейчас оно у вас почему-то в конце цикла и try/catch.

Спасибо! Помогло


  • 0

#4 BadMF

BadMF

    Специалист

  • Members
  • PipPipPipPipPip
  • 809 сообщений
  • ФИО:Dmitry Petrov

Отправлено 08 августа 2018 - 12:08

но теперь, если у вас это не тест, а тригер к оперативного принятия решения, вы начали опаздывать на 2 секунды =)

что конечно лучше чем на 12 секунд =)


  • 0

#5 Noksa

Noksa

    Активный участник

  • Members
  • PipPip
  • 117 сообщений
  • ФИО:Александр

Отправлено 09 августа 2018 - 09:58

Да даже если это тест. 

Если в каком-то тесте есть sleep, значит он есть и в других.

 

Страшно представить, сколько времени тупо в никуда уходит от таких решений.


  • 0

#6 Freiman

Freiman

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 591 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

Отправлено 09 августа 2018 - 10:36

Уважаемые опытные тестировщики, вы постановку задачи топикстартера вообще прочитали? :)

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


  • 0

#7 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 09 августа 2018 - 10:59

 

Уважаемые опытные тестировщики, вы постановку задачи топикстартера вообще прочитали? :)

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

 

Ну если придираться, то все равно такой хардкорный слип некорректно. Каждые две секунды - значит надо заводить таймер и запускать следующую итерацию по его окончании. Учитывая характер действий в цикле, даже сейчас маловероятно уложиться в две секунды на итерацию. 


  • 0

#8 Noksa

Noksa

    Активный участник

  • Members
  • PipPip
  • 117 сообщений
  • ФИО:Александр

Отправлено 09 августа 2018 - 11:05

 

Уважаемые опытные тестировщики, вы постановку задачи топикстартера вообще прочитали? :)

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

 

 

 

В таком случае надо писать по-другому, а не использовать thread.sleep напрямую.

 

В C# я бы реализовал это так. Здесь мы точно пойдём на следующую итерацию после двух секунд после загрузки страницы, а не после всех действий на ней.

var sw = new Stopwatch();
DriverManager.Driver.Navigate().GoToUrl("http://url.ru"); 
while (true)
            {                            
                sw.Start();
                var number = DriverManager.Driver.FindElements(By.TagName("b"));
                var str = number[2].Text;
                Console.WriteLine(string.IsNullOrEmpty(str) ? "Error" : str);
                sw.Wait().Until(_ => _.Elapsed.TotalSeconds >= 2);
                sw.Stop(); 
                sw.Reset();
                DriverManager.Driver.Navigate().Refresh(); 
             }

               

В Java есть что-то похожее. И да, вместо Thread.Sleep тогда уж использовали бы TimeUnit.


  • 0



Темы с аналогичным тегами Selenium, Java, testing

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных