diver.findElements повешен в Selenium - PullRequest
0 голосов
/ 03 мая 2018
int editBtnCount=driver.findElements(By.xpath("abc")).size();

Моя программа застревает в коде aboove, когда такой элемент не идентифицирован через xpath By.xpath("abc"). Таким образом, он должен вернуть 0, верно? Но зависает.

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

В соответствии с документацией findElements() метод находит все элементы на текущей странице, используя предоставленный механизм. На этот метод влияет таймфрейм, настроенный через implicitlyWait или явноlyWait во время выполнения. Когда неявно или явно ожидает, этот метод вернется, как только в найденной коллекции будет больше элементов, или вернется пустой список , если достигнут таймаут .

Я провел небольшой тест с вашей строкой кода следующим образом:

driver.get("https://www.google.com/");
System.out.println(driver.findElements(By.id("automaticSoldier")).size());
driver.quit();

Правильно печатает в консоли следующее:

Starting ChromeDriver 2.38.551601 (edb21f07fc70e9027c746edd3201443e011a61ed) on port 7531
Only local connections are allowed.
May 04, 2018 1:32:28 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
0

Но, как вы обнаружите, что программа зависает, основное подозрение выглядит так:

  • Вы настроили implicitlyWait() и WebDriver экземпляр ожидает.

Дополнительные соображения

Для лучшего Test Harness выполните следующие шаги:

  • Заменить экземпляр implicitlyWait() экземплярами explicitlyWait(), т.е. WebDriverWait(), где требуется.
  • Не смешивайте implicitlyWait() и explicitlyWait(). Это может привести к непредсказуемому времени ожидания.
  • Обновление JDK до последних уровней JDK 8u162 .
  • Обновление Селен до текущих уровней Версия 3.11.0 .
  • Обновление WebDriver вариант до текущих уровней. ChromeDriver v2.38 / GeckoDriver v0.20.1
  • Обновление WebClient вариант (например, Firefox , Chrome , IE , Edge , Safari ) до текущих уровней.
  • Очистите ваше Рабочее пространство проекта через IDE и Перестройте ваш проект только с необходимыми зависимостями.
  • Используйте CCleaner инструмент, чтобы стереть все рутинные операции ОС до и после выполнения Test Suite .
  • Если ваша базовая версия Web Client устарела, удалите ее через Revo Uninstaller и установите последнюю версию GA и выпущенную версию Web Клиент .
  • Взять перезагрузку системы .
  • Выполните свой @Test.
  • Всегда вызывайте driver.quit() в методе tearDown(){} для закрытия и уничтожения WebDriver и Веб-клиента экземпляров изящно.
0 голосов
/ 04 мая 2018

Hang не подходит для этого слова, может быть, вы хотите назвать его wait для определенного времени, которое вы должны были определить в своем сценарии. [Подразумеваемое ожидание, о котором я говорю].

ваш код

int editBtnCount=driver.findElements(By.xpath("abc")).size();  

будет ожидать элементов с xpath"abc", пока не будет объявлено неявное ожидание времени.

Если элементы найдены, метод .size() вернет счетчик.

else 0 будет возвращено без исключений .

0 голосов
/ 04 мая 2018

driver.findElement(By loc) и driver.findElements(By loc), оба метода подвержены влиянию implicit wait раз. Таким образом, оба метода будут возвращать соответствующий элемент / элементы или повторять попытку несколько раз, пока не будет достигнуто настроенное время ожидания. Поэтому, если ваш скрипт застрял, это ожидаемое поведение.

0 голосов
/ 04 мая 2018

Вы можете справиться с этим методом Try-catch, если такого элемента нет. Так что скрипт не будет продолжен после Exception без Hang.

try
{
int editBtnCount=driver.findElements(By.xpath("abc")).size();
}  catch (Exception e) 
   {
   System.out.println("Element not find");
   e.printStackTrace();
   }

Так что здесь, в try, он попытается найти элементы, и если его нет, он перейдет к блоку catch. И казнь будет продолжена. В catch вы также можете передать пользовательское сообщение.

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