WWW :: Mechanize :: Chrome如何关闭标签页

时间:2018-09-21 02:24:52

标签: perl google-chrome

使用WWW :: Mechanize :: Chrome时,我似乎不知道如何关闭标签页。

my $mech = WWW::Mechanize::Chrome->new();
$mech->get('https://www.google.com/');

没有$mech->close_tab()方法。

问题是,如何关闭当前使用的标签?

suggested by @zdim

my $driver = $mech->driver

似乎返回Chrome :: DevToolsProtocol实例。

然后,要关闭选项卡,您必须调用close_tab()函数并将当前选项卡作为参数传递:

$mech->driver->close_tab($mech->tab);

这种方法会产生以下错误,但是会关闭选项卡:

Calling ->catch in void context at C:/Perl64/site/lib/Chrome/DevToolsProtocol.pm line 567

2 个答案:

答案 0 :(得分:1)

Chrome::DevToolsProtocol中有一个close_tab方法,这是一个

  

用于DevTools协议的异步调度程序

并且不提供实例化对象的方法。

WWW::Mechanize::Chrome的方法driver记录为

  

访问连接到Chrome的Chrome :: DevToolsProtocol实例。

幸运的是,这很简单,也许$chrome->driver->close_tab可以做到。

构造函数还有一个driver选项,描述为

  

预制的Chrome :: DevToolsProtocol对象。

,没有更多详细信息。 更新:使用此功能需要做更多的工作

由于安装了54(五十四)个发行版后,安装最终失败,我仍然无法找到这些线索。

希望这可以帮助某人找出答案。


更新 强制安装后,我可以确认问题更新

use warnings;
use strict;
...

my $chrome = WWW::Mechanize::Chrome->new(tab => undef);  # new tab for demo

$chrome->get('https://www.google.com/');

sleep 5;  
$chrome->driver->close_tab($chrome->tab); 
sleep 5;

这会发出警告

Calling ->catch in void context at .../Chrome/DevToolsProtocol.pm line 567.
根据消息中引用的代码判断的

似乎在暴露错误。

答案 1 :(得分:0)

尚无->close_tab方法,因为我尚未发现需要它。

“驱动程序”对象是Chrome :: DevToolsProtocol对象,该对象用于与Chrome进行更直接的对话。在评论中建议在方法的随机结果上盲目调用随机方法,但这种方法似乎并不富有成效。

如果您迫不及待地希望关闭标签页而不是让$mech对象超出范围,则可以调用

$mech->driver->close_tab( $mech->tab )->get();

但这会破坏您可能用$mech完成的其他工作。 ->close_tab返回一个Future,所以您不应盲目丢弃它。

如果仅不希望显示任何标签,是否考虑过headless模式?

此问题交叉发布在https://perlmonks.org/?node_id=1222776上。