http://www.perlmonks.org?node_id=809772


in reply to Re^4: Using WWW::Selenium To Test Or Automate An Ajax Website
in thread Using WWW::Selenium To Test Or Automate An Ajax Website

Thanks for the tips! I finally figured it all out except for the class path stuff (I have no idea how to create a java classpath to the .jar file) but I eventually experimented until I figured out that I can run one terminal running selenium rc and open another terminal and run my perl code from that.

Low and behold my perl code comes to life and firefox loads up... only to die time and time again with a popup box that loads when you click 'login' on the website I'm trying to automate access to. After spending a whole day learning about how you need to select the popup box and close it, then select 'null' to get back to the original browser window I just can't seem to get my perl/selenium code to do what I want. The main issue is that upon clicking the 'logon' link at the website I'm trying to automate access, it is random event where by:

  1. No popup box pops up, or
  2. A popup box named 'stealth' pops up, or
  3. A popup box named 'entry' pops up.

I found that selenium is very fragile when it comes to coding the next step for it to preform... if I run my code without any mention to a popbox then everything is fine, but when I run the code and a popup box happens then it dies with a "255" exit message. Looking around the options in the IDE I couldn't see any program flow commands for selenium IDE so after going to the selenium website it seemed to me that program flow must come from the coding language you are using.

So I thought, ok, Perl has program flow commands, why not use the "if" statement and "elseif" and "else" for all three possibilities:

  1. no popup
  2. popup "stealth"
  3. popup "entry".

I coded it up as best as I could in Perl but then I got syntax errors where my blocks where. I was under the impression that something like $sel->title_is("Entry") would give perl a 'true' or 'false' and operate the program flow accordingly. Please help, I'm quite confused, a sample of the code is below:

my $sel = Test::WWW::Selenium->new( host => "localhost", port => 4444, browser => "*chrome", browser_url => "http://www.example +.com/" ); $sel->start(); $sel->set_timeout("60000"); $sel->open("/home/index.jsp"); $sel->click("link=Log in"); $sel->wait_for_page_to_load("60000"); if ($sel->title_is("Entry")) { $sel->select_window("entry"); $sel->close(); $sel->select_window("null"); } else ($sel->title_is("Stealth")) { $sel->select_window("stealth"); $sel->close(); $sel->select_window("null"); } $sel->click("emailAddress"); $sel->type("emailAddress", "anon@anywhere.com"); $sel->click("password"); $sel->type("password", "password"); $sel->click("remember"); $sel->click("subButton"); $sel->wait_for_page_to_load("60000");

Replies are listed 'Best First'.
Re^6: Using WWW::Selenium To Test Or Automate An Ajax Website
by Limbic~Region (Chancellor) on Nov 27, 2009 at 18:16 UTC
    icleave,
    Are you using the Selenium IDE FireFox plug-in to record your session and then modify it? Also, you are using Test::WWW::Selenium not WWW::Selenium. I think you want the latter not the former.

    I am not sure how to help you. Your code sample is fairly useless without the real website so that I can try it here to see what you are doing wrong. I am sorry, but unless you want to share the website and possibly login credentials, I can't guess what you are doing wrong.

    Update: As to your syntax errors - you should always use strict and use warnings. You have used else when you meant elsif. Also, you should either \@anywhere.com or you should use single quotes because it thinks your email address is really an array.

    Cheers - L~R

      Hi,

      Q: Are you using Selenium IDE FireFox plug-in to record?

      A: Yes. I have it record what I want to do, then I use the export function to put the Selenium commands into perl, then copy and paste into a text editor and remove the "_ok"s and place "sel->start();" in the code.

      RE: Test::WWW::Selenium - Thanks I changed that, but my code doesn't seem to run how I want it to.

      RE: Real website and login - The real website and my login is real in the code below.

      RE: Else, elsif, \@ - Thanks, I changed that too but my code doesn't seem to run how I want it to.

      Desired outcome:

      1. Go to www.cokezone.co.uk
      2. Login (and handle any pops if they happen
      3. Check the number of points in the account and put into a scalar variable $points
      4. Open a file handle <CODES> and read the codes into an array @codes
      5. Enter the codes into the website and check against the $points scalar variable to see if they were entered correctly - printing if the code was successful or not
      6. Carry on for each of codes in the array @codes
      7. Logout when done

      Progress: I've only gotten as far as no. 2 in the Selenium IDE, and I can only get to no. 1 using the Selenium RC and Perl.

      I'm pretty confident I can write a file handle and read it into an array and for each of the codes get Selenium to input them into the CokeZone website, however it's no use if I can't even automate a login that handles the popups!

      Code I've written to try to login and handle the popups:

      #! /usr/bin/perl use strict; use warnings; use WWW::Selenium; my $sel = WWW::Selenium->new( host => "localhost", port => 4444, browser => "*chrome", browser_url => "http://www.cokezon +e.co.uk" ); $sel->start(); $sel->open("/home/index.jsp"); $sel->click("link=Log in"); $sel->wait_for_page_to_load("30000"); if ( $sel->is_text_present("Thanks for visiting!\n\nNow here's your ch +ance to tell us what you think. This quick and easy survey will only +take you a few minutes to fill out, and it'll help us to get more of +the stuff you want to see into 'Coke Zone'.\n\nThanks for your help,\ +nThe 'Coke Zone' Team") == 1 ) { $sel->select_window("entry"); $sel->close(); $sel->select_window("null"); } if ( $sel->is_text_present("At the end of your visit on this website p +lease take the time to complete an on-line survey, which will provide + us with feedback on the website. Please do not close this window.\n\ +nEnjoy your visit") == 1 ) { $sel->select_window("stealth"); $sel->close(); $sel->select_window("null"); } $sel->click("emailAddress"); $sel->type("emailAddress", "bogus\@fake.com"); $sel->type("password", "password"); $sel->click("remember"); $sel->click("subButton"); $sel->wait_for_page_to_load("30000"); my $points = $sel->get_text("//div[\@id='header_links']/div[1]/div[1]/ +h3"); print $points $sel->click("link=Log out"); exit 0;
        icleave,
        Please remove your user name and password. That is a stupendously bad idea. I assumed you would have /msg'd them to me. I have them now and will update this node later today with a working version.

        Update: It appears that codes appearing on US bottles of coke do not work at the UK site. I will need a few codes to make this work - you have my email address.

        Update 2: While I read the terms of use and didn't see anything preventing scraping or automation, the US site heavily relies on JavaScript that gives the appearance of thwarting this type of automation.

        • I needed to use $sel->focus($loc) to ensure the 'onFocus' event triggered
        • The above could also have been accomplished with $sel->fire($loc, 'event')
        • I also needed to use $sel->mouse_over($loc) before clicking the button
        Additionally, the site used fancy CSS to get you to click on an image of what kind of soda the code came from. After spending a lot of time getting that "just right", I realized it was not necessary - if entered the next code it would just silently update your points. You can also completely ignore any pop-ups when you go to the site because they do not interfere with site interaction.

        I would be happy to share with you the code I wrote to automate the US site but I don't know how applicable it will be to the UK site. Beyond that, I am not interested in doing this for you as it is very time consuming to get "just right". You have my email if you would like to consider other arrangements.

        Cheers - L~R