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

Perl下Selenium操作Shadow DOM报错:无法调用未引用对象的find_elements方法

解决Perl Selenium操作Shadow DOM时的"Can't call method 'find_elements' on unblessed reference"错误

错误原因

这个错误的核心是你尝试调用find_elements方法的对象不是Perl Selenium的合法实例对象。Perl的Selenium::Remote::Driver/Selenium::Chrome不直接支持Shadow DOM的API,如果你把JavaScript执行返回的Shadow Root或普通引用当成Driver/WebElement对象调用find_elements,就会触发这个错误——因为这些返回值没有被Perl的Selenium类"bless"(即不是合法的类实例)。

正确实现方式

所有Shadow DOM的元素定位逻辑都需要封装在JavaScript中,通过execute_script执行后直接返回目标WebElement对象或对象数组,再用Perl处理这些返回的合法对象。

示例1:获取单个Shadow DOM元素并操作

use Selenium::Chrome;

# 初始化Chrome驱动
my $driver = Selenium::Chrome->new(
    # 可根据需要添加参数,比如headless模式
    extra_capabilities => {
        'goog:chromeOptions' => { args => ['--headless', '--no-sandbox'] }
    }
);
$driver->get('目标页面URL');

# 执行JS获取Shadow DOM内的元素
my $target_elem = $driver->execute_script(<<'JS');
// 替换成你的Shadow DOM定位逻辑
const rootElem = document.querySelector('#root'); // 宿主元素
const shadowRoot = rootElem.shadowRoot;
return shadowRoot.querySelector('.btn-submit'); // 目标元素选择器
JS

# 验证返回对象合法性并操作
if (ref $target_elem eq 'Selenium::Remote::WebElement') {
    $target_elem->click;
    print "点击Shadow DOM元素成功\n";
} else {
    die "未找到Shadow DOM内的目标元素";
}

$driver->quit;

示例2:获取多个Shadow DOM元素

# 承接上面的驱动初始化和页面加载逻辑
my $elem_list = $driver->execute_script(<<'JS');
const rootElem = document.querySelector('#app');
const shadowRoot = rootElem.shadowRoot;
// querySelectorAll返回元素数组,会被Perl转换成WebElement对象数组引用
return Array.from(shadowRoot.querySelectorAll('.list-item'));
JS

# 遍历处理每个元素
foreach my $item (@$elem_list) {
    my $text = $item->get_text;
    print "列表项文本:$text\n";
}

关键注意事项

  • 不要尝试在JS返回的Shadow Root对象上调用Perl Selenium的find_elements/find_element方法,Shadow Root不是Perl的Selenium类实例,不支持这些方法。
  • 确保JS代码返回的是单个WebElement或WebElement数组(用Array.from转换NodeList为数组,避免Perl无法识别)。
  • 执行JS后务必检查返回值的类型,避免对非对象引用调用方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:11:05