首页 > 解决方案 > 如果超时如何让wait_until死

问题描述

use Selenium::Waiter 'wait_until';
use Selenium::Remote::Driver;
$selen = Selenium::Remote::Driver->new( ... );

$elem = wait_until { $selen->find_element('//h1[@class="banner-heading"]') };

在上面的代码中,如果没有找到正在查找的元素,或者wait_until超时,我希望脚本死掉。我怎样才能做到这一点?的默认行为wait_until是在超时时返回一个空字符串。

标签: seleniumperl

解决方案


正如Selenium::Waiter医生所说的那样

请在继续之前检查返回值,因为我们不明智地抑制了您的 BLOCK 可能进行的任何死亡或呱呱叫的尝试。您传递的 BLOCK 在 a"try" in Try::Tiny中调用,如果您的函数调用中的任何一个 throw 并且 BLOCK 永远不会变为真,我们将在返回 false 之前恰好在结束时恰好一次 carp。

然后继续允许我们纾困

如果你还是想死,只需将 die => 1 传递给 wait_until :

# Dies on the first failure, do your own error handling:
wait_until { die 'oops' } die => 1;

我已经对其进行了测试,并且可以正常工作。还可以调整等待时间和重试间隔。

请注意文档的警告以确保将implicit_waitfromSelenium::Remote::Driver设置为低值(默认情况下,但如果 调用 set_implicit_wait_timeout可能会更改)。

至于因找不到 find_element 而死Selenium::Remote::Driver默认情况下会这样做

如果找不到该元素,我们将 CROAK,杀死您的脚本。

所以

my $elem = wait_until { $selen->find_element(...) } die => 1;

应该做你需要的。


推荐阅读