Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

[Solved] Checking onclick attribute of an anchor tag with WWW:::Mechanize::Firefox

by Riales (Hermit)
on Mar 05, 2012 at 08:14 UTC ( #957850=perlquestion: print w/ replies, xml ) Need Help??
Riales has asked for the wisdom of the Perl Monks concerning the following question:

Hello Monks,

I am trying to check the onclick attribute of anchor tags with WWW::Mechanize::Firefox. Here is what I have explored so far...

At first, I thought I'd check the attrs property of WWW::Mechanize::Link. Something like this:

my @links = $mech->find_all_links(url_regex => 'asdf.html'); foreach my $link (@links) { print $link->attrs()->{onclick}; }

Unfortunately, that did not work. Further exploration yielded the reason--the make_link subroutine in WWW::Mechanize::Firefox always just initializes attrs with an empty hashref.

No problem, I thought--maybe I could just patch that functionality in. Not much success with that either, though--I'm having a tough time understanding how the MozRepl::RemoteObject module works. I thought something like this sound work:

my @links = $mech->find_all_links_dom(url_regex => 'asdf.html'); foreach my $link (@links) { print $link->{onclick}; }

Or:

my @links = $mech->find_all_links_dom(url_regex => 'asdf.html'); foreach my $link (@links) { print $link->__attr('onclick'); }

Or at least:

my @links = $mech->find_all_links_dom(url_regex => 'asdf.html'); foreach my $link (@links) { # Neither of the following work either... print Dumper($link->__keys); print Dumper(keys %$link); }

This is the error message I receive. It seems like a Javascript error, but that's all I can surmise...

MozRepl::RemoteObject: TypeError: obj.hasOwnProperty is not a function + at /usr/local/share/perl/5.10.1/MozRepl/RemoteObject.pm line 1509

What am I missing? Is there a simpler way to go about this?


EDIT:

Solved! Just to clarify, I was looking for just the text of the onclick attribute of links. When I was doing $link->{onclick}, I was getting the compiled Javascript of the onclick attribute. To get just the simple text, all I had to do was $link->getAttribute('onclick').

Thanks all!

Comment on [Solved] Checking onclick attribute of an anchor tag with WWW:::Mechanize::Firefox
Select or Download Code
Re: Checking onclick attribute of an anchor tag with WWW:::Mechanize::Firefox
by bitingduck (Friar) on Mar 05, 2012 at 09:12 UTC

    I haven't used it, but reading way down in the examples in the docs, it looks like you might want the "$mech->clickables" method. It's listed near the bottom of "Form Methods"

    It gives the example:
    print "You could click on\n"; for my $el ($mech->clickables) { print $el->{innerHTML}, "\n"; };

      Hi, bitingduck!

      Thanks for the reply. I hadn't noticed the clickables method before so I went ahead and tried it out. Progress! Now there is something to dump when I check $link->{onclick}, but it's a blessed MozRepl::RemoteObject. It's pretty massive so I won't post it here (unless requested). I still can't figure out how to just see what the onclick attribute is though...

        I still can't figure out how to just see what the onclick attribute is though...

        Try $node->getAttribute

Re: Checking onclick attribute of an anchor tag with WWW:::Mechanize::Firefox
by Corion (Pope) on Mar 05, 2012 at 13:32 UTC

    Your code is good, but I'm not sure what you want to do:

    #!perl -w use strict; use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new(); $mech->update_html(<<HTML); <html> <h1>Test</h1> <a href="http://google.de">Google</a> <a href="asdf.html" onclick="javascript:alert('hello');">Say Hello</a> </html> HTML my @links = $mech->find_all_links_dom(url_regex => 'asdf.html'); foreach my $link (@links) { #print $link->{onclick}; print $link->{click}; };

    This gives you the onclick attribute, but that attribute is a (compiled) Javascript function. If you want to get at the text, use -getAttribute function (see the DOM documentation).

    MozRepl::RemoteObject is a bridge between Perl and the (DOM) functions and data structures of Firefox, so if you want to do deeper work, you will have to learn about the DOM and Firefox.

      Hi Corion,

      Ah, perfect--getAttribute was what I was looking for. It never occurred to me to try the DOM documentation. I guess I'll know for next time now! Thanks!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://957850]
Approved by Eliya
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (9)
As of 2014-08-21 07:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (128 votes), past polls