Я не могу понять, как закрыть вкладку при использовании WWW :: Mechanize :: Chrome.

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

Нет никакого метода $mech->close_tab().

Итак, вопрос в том, как закрыть вкладку, с которой вы сейчас работаете?

Как предложено @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
3
user735247 21 Сен 2018 в 05:24

2 ответа

Лучший ответ

В Chrome :: DevToolsProtocol есть метод close_tab, который является

асинхронный диспетчер для протокола DevTools

И не предлагает метода для создания экземпляра объекта.

В WWW :: Mechanize :: Chrome есть метод драйвер, зарегистрированный как

Получите доступ к экземпляру Chrome :: DevToolsProtocol, подключенному к Chrome.

В удачном случае, если это просто, возможно, $chrome->driver->close_tab сможет это сделать.

Также есть опция driver для его конструктора, описанная как

Готовый объект протокола Chrome :: DevTools.

Без дополнительных подробностей. Обновление: для этого требуется дополнительная работа .

Я пока не могу продолжать эти ключи , так как установка упорно терпит неудачу в конце , после 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
zdim 24 Сен 2018 в 07:44

Нет метода ->close_tab, потому что я еще не нашел в нем необходимости.

Объект «драйвер» - это объект Chrome :: DevToolsProtocol, который используется для более непосредственного взаимодействия с Chrome. Слепой вызов случайных методов для случайных результатов методов рекомендуется здесь, в комментариях, но это не метод, который кажется плодотворным.

Если вы одержимы закрытием вкладки вместо того, чтобы позволить объекту $mech выйти за пределы области видимости, вы можете вызвать

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

Но это нарушит ваши дальнейшие действия с $mech. ->close_tab возвращает будущее, поэтому не следует отбрасывать его вслепую.

Если вы просто не хотите, чтобы вкладка отображалась, рассматривали ли вы режим headless?

Этот вопрос был размещен на странице https://perlmonks.org/?node_id=1222776.

0
Corion 24 Сен 2018 в 11:04