Как подавить предупреждение с помощью Selenium::Remote::Driver?

no warnings;
use Selenium::Remote::Driver;
 
my $driver = Selenium::Remote::Driver->new;
$driver->get('https://www.crawler-test.com/');
$driver->find_element_by_xpath('//a[.="text not found"]');

Как я могу заставить приведенный выше код not печатать это предупреждение:

Ошибка при выполнении команды: такого элемента нет: Не удалось найти элемент: //a[.=текст не найден]

Согласно документам, функция выдает предупреждение, если нет элемент найден, но наличие no warnings; в скрипте не подавляет его.

Как я могу подавить это предупреждение?


person CJ7    schedule 16.07.2020    source источник


Ответы (2)


Используйте find_element вместо find_element_by_xpath. Первый выдает исключение вместо предупреждения. Вы можете поймать эти исключения, используя следующие оболочки:

sub nf_find_element {
   my $node;
   if (!eval {
      $node = $web_driver->find_element(@_);
      return 1;  # No exception.
   }) {
      return undef if $@ =~ /Unable to locate element|An element could not be located on the page using the given search parameters/;
      die($@);
   }

   return $node;
}


sub nf_find_elements {
   my $nodes;
   if (!eval {
      $nodes = $web_driver->find_elements(@_);
      return 1;  # No exception.
   }) {
      return undef if $@ =~ /Unable to locate element|An element could not be located on the page using the given search parameters/;
      die($@);
   }

   return wantarray ? @$nodes : $nodes;
}


sub nf_find_child_element {
   my $node;
   if (!eval {
      $node = $web_driver->find_child_element(@_);
      return 1;  # No exception.
   }) {
      return undef if $@ =~ /Unable to locate element|An element could not be located on the page using the given search parameters/;
      die($@);
   }

   return $node;
}


sub nf_find_child_elements {
   my $nodes;
   if (!eval {
      $nodes = $web_driver->find_child_elements(@_);
      return 1;  # No exception.
   }) {
      return undef if $@ =~ /Unable to locate element|An element could not be located on the page using the given search parameters/;
      die($@);
   }

   return wantarray ? @$nodes : $nodes;
}

nf означает несмертельный.

Написано для Selenium::Chrome, но должно работать и с Selenium::Remote::Driver.

person ikegami    schedule 16.07.2020
comment
find_element_by_xpath выдает предупреждение. find_element будет хрипеть. - person CJ7; 16.07.2020

Согласно документам, функция выдает предупреждение, если нет элемент найден, но наличие no warnings; в скрипте не подавляет его.

Вот так. Прагма warnings является лексической. Добавление no warnings к вашему коду повлияет только на ваш код. Это не отключит предупреждения в других модулях, которые использует ваш код. Как сказано в в документации:

Эта прагма работает так же, как и строгая прагма. Это означает, что область применения директивы warning ограничена окружающим блоком. Это также означает, что параметр прагмы не будет просачиваться между файлами (через use, require или do). Это позволяет авторам самостоятельно определять степень проверок предупреждений, которые будут применяться к их модулю.

person Dave Cross    schedule 16.07.2020