4
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"]');

我怎样才能让上面的代码打印这个警告:

执行命令时出错:没有这样的元素:无法找到元素://a[.="text not found"]

根据文档,如果没有找到元素,该函数会发出“警告”,但no warnings;在脚本中并不会抑制它。

我怎样才能压制这个“警告”?

4

2 回答 2

4

使用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 一起使用。

于 2020-07-16T07:30:51.000 回答
3

根据文档,如果没有找到元素,该函数会发出“警告”,但no warnings;在脚本中并不会抑制它。

这是正确的。warningspragma 是词法的。添加no warnings到您的代码中只会影响您的代码。它不会关闭您的代码使用的其他模块中的警告。正如文档所说:

这个 pragma 就像“strict” pragma 一样工作。这意味着警告 pragma 的范围仅限于封闭块。这也意味着 pragma 设置不会跨文件泄漏(通过“use”、“require”或“do”)。这允许作者独立定义将应用于其模块的警告检查的程度。

于 2020-07-16T12:55:27.240 回答