You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl结合Selenium::Chrome无法通过Ctrl+S保存网页的问题求助

问题解决:Perl Selenium::Chrome 无法触发Ctrl+S保存网页

核心问题分析

你的代码里ActionChains定义了按键动作,但没有执行——Selenium的ActionChains需要调用perform()方法才会把队列里的动作发送给浏览器执行,这是导致按键无响应的直接原因。另外,绑定按键到<html>元素不是必须的,全局按键操作可以直接作用于浏览器窗口,无需指定元素。

修正后的代码

#!/usr/bin/env perl

# seleniumTest.pl

use strict;
use warnings;
use Selenium::Chrome;
use Selenium::Remote::WDKeys;
use Selenium::ActionChains;

my $url = 'https://www.example.com/foo';
my $profile_path = '/home/cf/.config/google-chrome';
my $profile_name = 'Profile 1';

my $driver = Selenium::Chrome->new (
    extra_capabilities => {
        'goog:chromeOptions' => {
            args => [
                'user-data-dir=' . $profile_path,
                'profile-directory=' . $profile_name
            ],
        }
    }
);

$driver->set_implicit_wait_timeout(5000);
$driver->get($url);

warn $driver->get_title();
sleep 5;
warn "opened";

# 初始化ActionChains并执行Ctrl+S
my $action_chains = Selenium::ActionChains->new(driver => $driver);
$action_chains->key_down(KEYS->{'control'})
              ->send_keys('s')
              ->key_up(KEYS->{'control'})
              ->perform(); # 必须调用perform执行动作
sleep 5;
warn "try to save";

# 执行Alt+S确认保存
$action_chains->key_down(KEYS->{'alt'})
              ->send_keys('s')
              ->key_up(KEYS->{'alt'})
              ->perform(); # 同样需要perform
warn "saved?";

sleep 5;
$driver->shutdown_binary;
warn "ended";

更可靠的替代方案:直接获取源码保存

模拟系统对话框的方式依赖于浏览器UI行为和系统焦点,稳定性差。更稳妥的方式是直接获取页面完整HTML源码,写入本地文件:

#!/usr/bin/env perl

use strict;
use warnings;
use Selenium::Chrome;

my $url = 'https://www.example.com/foo';
my $profile_path = '/home/cf/.config/google-chrome';
my $profile_name = 'Profile 1';

my $driver = Selenium::Chrome->new (
    extra_capabilities => {
        'goog:chromeOptions' => {
            args => [
                'user-data-dir=' . $profile_path,
                'profile-directory=' . $profile_name
            ],
        }
    }
);

$driver->get($url);
# 获取页面完整HTML
my $page_html = $driver->get_page_source();

# 写入本地文件
open my $fh, '>', 'saved_page.html' or die "无法打开文件: $!";
print $fh $page_html;
close $fh;

$driver->shutdown_binary;
warn "页面已保存为saved_page.html";

补充说明

  • 若需保存包含动态加载内容的页面,要确保等待所有元素加载完成(可使用$driver->wait_for_element_present()或延长等待时间)。
  • 直接获取源码的方式不受浏览器设置、系统弹窗拦截影响,是自动化保存页面的首选方案。

内容的提问来源于stack exchange,提问作者Chihiro Fukazawa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:25:17