首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Selenium Perl处理阴影DOM

Selenium Perl处理阴影DOM
EN

Stack Overflow用户
提问于 2022-09-15 00:33:07
回答 1查看 69关注 0票数 0

使用Selenium处理影子DOM的例子很多。我也想用Perl来做同样的事情。

Perl的Selenium::Remote::Driver不支持影子DOM,但是我应该能够通过JavaScript完成它。我从accessing-shadow-dom-tree-with-selenium那里得到灵感。

下面是我用Perl编写的代码

代码语言:javascript
运行
复制
#!/usr/bin/env perl

use Selenium::Chrome;

my $driver = Selenium::Chrome->new (
   startup_timeout => 60, 
   custom_args => "--log-path=/tmp/selenium_chromedriver",
   logfile => "/tmp/selenium_chromedriver2", 
   debug_on => 1,
   extra_capabilities => {
      'goog:chromeOptions' => {
         args => [
            '--no-sandbox',
            '--disable-dev-shm-usage', 
            '--window-size=1260,720',
            '--user-data-dir=/tmp/selenium_chrome',
         ],  
      },  
   },  
);

$driver->get("chrome-search://local-ntp/local-ntp.html"); # chrome new tab
my $shadow_host = $driver->find_element("html/body/ntp-app", "xpath");
my $shadow_root = $driver->execute_script('return arguments[0].shadowRoot', $shadow_host);

for my $e ( @{$shadow_root->find_elements(':host > *', 'css')} ) { 
   # error: Can't call method "find_elements" on unblessed reference
   print "found\n";
}

$driver->shutdown_binary();

但是我得到了错误:不能在不受祝福的引用上调用方法"find_elements“。

我如何克服这个错误?

谢谢你的帮助。

  • My环境是: ubuntu 18,Perl5.26,Selenium:Chrome1.46,Chrome 99,chromeDriver99。
  • 使用Python3.8.5测试了相同的机制。
  • 为什么不使用?因为我工作地点的服务器只有Perl,而不是Python3.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-19 11:21:53

以下代码起作用

代码语言:javascript
运行
复制
#!/usr/bin/env perl

use Selenium::Chrome;

my $driver = Selenium::Chrome->new (
   startup_timeout => 60,
   custom_args => "--log-path=/tmp/selenium_chromedriver",
   logfile => "/tmp/selenium_chromedriver2",
   debug_on => 1,
   extra_capabilities => {
      'goog:chromeOptions' => {
         args => [
            '--no-sandbox',
            '--disable-dev-shm-usage',
            '--window-size=1260,720',
            '--user-data-dir=/tmp/selenium_chrome',
         ],
      },
   },
);

$driver->get("chrome-search://local-ntp/local-ntp.html"); # chrome new tab
my $shadow_host = $driver->find_element("html/body/ntp-app", "xpath");

package MyShadow {
   sub new {
      my ($class, %attrs) = @_;
      my $shadow_root = $attrs{driver}->execute_script('return arguments[0].shadowRoot', $attrs{shadow_host});
      return undef if ! $shadow_root;
      $attrs{shadow_root} = $shadow_root;
      bless \%attrs, $class;
   }
   sub find_element {
      my ($self, $target, $scheme) = @_;
      die "scheme=$scheme is not supported. Only css is supported" if $scheme ne 'css';
      return $self->{driver}->execute_script(
                 "return arguments[0].querySelector(arguments[1])",
                 $self->{shadow_root},
                 $target
             );
   }
   sub find_elements {
      my ($self, $target, $scheme) = @_;
      die "scheme=$scheme is not supported. Only css is supported" if $scheme ne 'css';
      return $self->{driver}->execute_script(
                "return arguments[0].querySelectorAll(arguments[1])",
                $self->{shadow_root},
                $target
      );
   }
};

my $shadow_driver = MyShadow->new(driver=>$driver, shadow_host=>$shadow_host);
if ($shadow_driver) {
   for my $e ( @{$shadow_driver->find_elements(':host > *', 'css')} ) {
      print "found\n";
   }
}

$driver->shutdown_binary();

要点:

  • For Selenium,不管是Python还是Perl,它们都是javascript的包装器。只要你得到正确的javascript,你就可以做你想做的任何事情.

用于阴影驱动程序的find_elements().

  • ,您只需要实现find_element()和find_element

  • I只实现了“css”,而没有实现“xpath”,因为在2022/09/19时,

就是这么做的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73724414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档