【问题标题】:WWW::Mechanize::Chrome How to close a tabWWW::Mechanize::Chrome 如何关闭标签
【发布时间】:2018-09-21 02:24:52
【问题描述】:

在使用 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

【问题讨论】:

    标签: perl google-chrome


    【解决方案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;
    

    这确实会发出警告

    在 .../Chrome/DevToolsProtocol.pm 第 567 行的 void 上下文中调用 ->catch。

    从消息中引用的代码判断,这似乎暴露了一个错误。

    【讨论】:

    • 我已经尝试过了,但我收到了一个错误:“无法在 unblessed reference 上调用方法“close_tab””。 $chrome->tab 返回包含当前选项卡信息的哈希值。它似乎不是可用于调用“close_tab”的 Chrome::DevToolsProtocol 对象
    • @user735247 好的,请您尝试直接在$chrome 上拨打close_tab 吗?这已经安装了 54 个(五十四个)发行版,然后在“构建和测试......”中失败了。我正在再试一次,但还不能玩(自从我上次尝试后忘记了)。
    • $chrome 没有 close_tab 功能:无法通过包 "WWW::Mechanize::Chrome" 定位对象方法 "close_tab"
    • @user735247 将我的帖子更新到我现在的位置。如果安装以某种方式成功,我会查看更多并更新。
    • 我更新了我的问题以包含您建议的方法
    【解决方案2】:

    没有->close_tab 方法,因为我还没有发现需要它。

    “驱动程序”对象是一个 Chrome::DevToolsProtocol 对象,用于更直接地与 Chrome 对话。在 cmets 中,这里建议对方法的随机结果盲目调用随机方法,但这不是一种似乎有成效的方法。

    如果您一心想要关闭标签而不是让$mech 对象超出范围,您可以调用

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

    但这会破坏您使用$mech 所做的更多事情。 ->close_tab 返回一个 Future,所以你不应该盲目地丢弃它。

    如果您只想不显示任何选项卡,您是否考虑过headless 模式?

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

    【讨论】:

    • 感谢您的参与并感谢您提供模块。至于“在方法的随机结果上盲目调用随机方法”(我认为它是指我的帖子下的 cmets)——(1)我不得不“盲目”地去做,因为文档守口如瓶(2)这不是随机的,再次就文档指导我而言。 // 至于选项卡,你是说没有关闭选项卡的好方法吗?我忍不住要注意,在安装失败(成功安装 54 个依赖项之后)期间我经常观看的测试经常打开和关闭选项卡。
    • 再次感谢您向所有人提供您的工作。但是我必须在这里对您的帖子提出另一个问题,“->close_tab 返回一个未来”——不,它没有;文档什么也没说。我可以阅读代码,但由于文档只说“关闭选项卡”,它让人认为该方法,嗯,关闭了一个选项卡。
    • 该对象并非真正用于外部使用。我已经向它添加了更多文档,但是在 WWW::Mechanize::Chrome 之外使用该模块仍然没有多大意义。测试应该在headless 模式下运行 Chrome,也就是说,它们不应该弹出(然后关闭)选项卡,但是如果您已经有一个 Chrome 实例在启动调试协议的情况下运行,它可能会运行 headfull。
    • 感谢您的澄清;用它来做这件事似乎有点牵强,甚至很尴尬。没有运行 Chrome 实例(我使用的是 firefox)。并且测试启动 Chrome。然后,它可能会留下它(我不记得了),在这种情况下确实会有一个用于下一个测试的实例。
    • 选项卡保持打开状态,即使在 $mech 超出范围后,除非使用驱动程序的 close_tab 函数将其关闭。使用“undef $mech”也不会关闭打开的选项卡。至少在我这边。
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多