Watir and Inheritance

I’m trying to do this:

require ‘Watir’

class Navigator<Watir::IE
def initialize(maxim)
@maxim=maxim
@iex=Watir::IE.new
end
def go(url)
@iex.goto(url)
if @maxim==1 then
@iex.maximize()
end
end
end

naveg=Navigator.new(1)
naveg.go(“http://www.google.es”)

puts naveg.url

I want my ‘naveg’ object can display the methods and properties of
wakir, url for example. What am I doing wrong?

Without looking at this too indepth…
you are inheriting from Watir::IE, and then making a new instance of
it inside of it? Ehh?

Start off with changing
class Navigator<Watir::IE
to
class Navigator

Now your class will work (but won’t be inheriting). I don’t know what
you really want to do with your class :slight_smile: but hey, have fun playing
with it!

–Kyle

Mario R. wrote:

I want my ‘naveg’ object can display the methods and properties of
wakir, url for example. What am I doing wrong?

You want to call the url method on the @iex object, not the navigator
object. Try this:

require ‘Watir’

class Navigator<Watir::IE
def method_misssing(name,*args)
if @iex.respond_to? name
@iex.send(name,*args)
end
end
def initialize(maxim)
@maxim=maxim
@iex=Watir::IE.new
end
def go(url)
@iex.goto(url)
if @maxim==1 then
@iex.maximize()
end
end
end

naveg=Navigator.new(1)
naveg.go(“http://www.google.es”)

puts naveg.url

If I write the class without inheriting, how can I get the ‘url’ outside
of the class?

Drew O. wrote:

You want to call the url method on the @iex object, not the navigator
object. Try this:

This is not working.

Jesús Gabriel y Galán wrote:…

I’m sorry but it doesn’t work because the class doesn’t understand the
IE methods without the suffix.

On 10/23/07, Mario R. [email protected] wrote:

@iex.goto(url)

I want my ‘naveg’ object can display the methods and properties of
wakir, url for example. What am I doing wrong?

I think what you are doing wrong is having a Watir::IE object inside
your Navigator class. If you inherit from IE you have all methods in
IE available so you don’t need to wrap another instance of IE inside.
Can you try this (not tested):

require ‘Watir’

class Navigator<Watir::IE
def initialize(maxim)
@maxim=maxim
end
def go(url)
goto(url)
if @maxim==1 then
maximize()
end
end
end

naveg=Navigator.new(1)
naveg.go(“http://www.google.es”)

puts naveg.url

Hope this helps,

Jesus.

By the way the error is:
c:/ruby/lib/ruby/site_ruby/1.8/Watir.rb:1341:in url': undefined methodLocationURL’ for nil:NilClass (NoMethodError)
from tempexample.rb:22

Watir’s ie object allows you to get at things like the url using
public methods. Unless the idea really is extending or or replacing
them, inheritance shouldn’t be necessary (or probably advised). Well,
that is unless the whole point is to play around with Watir to learn
about it, more than get work done :wink:

I think Jesus’ approach is correct. It only missed the initialization of
the
super class:

class Navigator<Watir::IE
def initialize(maxim)
super()
@maxim=maxim
end
def go(url)
goto(url)
if @maxim==1 then
maximize()
end
end
end

At first I thought calling ‘super’ would do but then I was pointed out
by
him that ‘super’ calls the superclass’ initialize method with the same
number of parameters, so we need parenthesis (good to know :slight_smile:

Anyway with ‘super()’ it seems it works:

naveg=Navigator.new(1)
naveg.go(“http://www.google.es”)

puts naveg.url # => => “http://www.google.es/

/Rubén

Now it works fine.

Thank you very much.