My pleasure! 

And, great follow-up - very useful information! And, some great advice
for me going forward!

Thanks so much! :)

 
Thanks,
-Jason 
  
  
Jason L. Alexander  >  Chief Technology Officer >
Telligent Systems, Inc.  > http://telligent.com > w: 214.420.1333  >
http://JasonA.net 

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Bret Pettichord
Sent: Friday, September 15, 2006 2:25 PM
To: wtr-general@rubyforge.org
Subject: Re: [Wtr-general] WIN32OLERuntimeError: unknown property or
method

Jason Alexander wrote:
> Thanks for everyone's help!
>
> Actually, I found a workaround of sorts -
>
> In my tests, I would grab a div and assign it to a variable and use 
> that variable throughout. The problem was, during the operations after

> the var assignment, I would do some things that would cause postbacks.

> And, any references after those postbacks seemed to have lost all
context.
>
> Removing the variable assignment and references and just calling 
> straight to div() fixed all the issues.
>
> Very interesting, though. I'm not sure if this would be considered a 
> bug, or a normal practice that I should watch out for going forward.
Jason. Thanks for letting us know what the problem was.

Recently the following recommendation to use variables was posted to 
this list:
> When you're identifying an element that may may be many frames deep,
or 
> even deep within a single frame, save the element into a variable.
This 
> way Watir doesn't go through the entire search process every time you 
> use the element:
>
> myframe = ie.frame(:name, "frame3").frame(:name,
"frame4").frame(:name, 
> "tframe1")
> puts myframe.html
> myframe.select_list(:name, "fromedate").flash
>   
> Your Watir code also ends up a lot more readable without the very long

> lines  :-) 
I think this is a bad idea because of exactly the kinds of problems that

Jason encountered.

This is a good example of how you can optimize your script for 
performance at the risk of reliability. Specifically, this approach only

works until your script initiates a new page load. After that point, any

variables you have that reference page elements will now be stale and 
you will get OLE errors if you try to use them. The problem is that 
Watir element references are not specific to a particular page, 
considered as something corresponding to a URL or set of HTML, but 
rather to a particular load of such a page. I have found that many 
testers find it confusing to have to think about the relative timing of 
Watir evaluation with respect to browser loading and therefore stopped 
encouraging the use of variables in my Watir classes for testers. Indeed

we sometimes get questions on this list from testers who have done 
exactly this and then ask why they are getting OLE errors. My 
recollection is that i've been the only one to have responded to these 
posts, so i suspect that this problem is not well understood in the 
community.

I have found that web scrapers generally need performance and understand

the how Watir interacts with the page loading, so they are eager to use 
techniques like this. But testers usually would rather pay a small 
performance penalty for return for simplicity and reliability.

Testers who like the idea of making your code easier to read, can use 
another technique that does not sacrifice reliability (nor improve 
performance):

    def myframe
    $ie.frame(:name, "frame3").frame(:name, "frame4").frame(:name,
    "tframe1")
    end

    puts myframe.html
    myframe.select_list(:name, "fromedate").flash  

This approach with work regardless of whether a page load happens, so 
you don't need to think about that.

The trick to making this technique work is to make sure that you have a 
valid reference to "ie" in the method. The easiest way to do this is to 
make the variable global (as shown here). If you know how to use 
instance variables, that can also work. Or you can pass it in as a 
parameter.

Another technique that also simplifies code is this:

    def with thing, &block
    thing.instance_eval &block
    end

    with ie.frame(:name, "frame3").frame(:name, "frame4").frame(:name,
    "tframe1") do
    puts html
    select_list(:name, "fromedate").flash
    end

In this case, you do need to make sure that you don't do a page load in 
the middle of the do/end block. This technique also gives you the 
performance benefits of the variable.

Bret

_______________________________________________
Wtr-general mailing list
Wtr-general@rubyforge.org
http://rubyforge.org/mailman/listinfo/wtr-general
_______________________________________________
Wtr-general mailing list
Wtr-general@rubyforge.org
http://rubyforge.org/mailman/listinfo/wtr-general

Reply via email to