There are plenty examples using Selenium Python to handle shadow DOM. I'd like to do the same in Perl.
Perl's Selenium::Remote::Driver doesn't have shadow DOM support, but I should be able to do it through JavaScript. I got my inspiration from accessing-shadow-dom-tree-with-selenium.
The following is my code in Perl
#!/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(); But I got error: Can't call method "find_elements" on unblessed reference.
How can I overcome this error?
Thank you for any help.
- My environment is: ubuntu 18, Perl 5.26, Selenium:Chrome 1.46, Chrome 99, chromedriver 99.
- The same mechanism is tested working with Python 3.8.5.
- Why I am not using Python? because the server in my work place only has Perl, no Python 3.