Starting Method/Class issues

Hi I’ve been learning Ruby to help with scripting some tests, but the
books I have are only using mathematical method/class creations and my
attempts to make my own methods are failing. Looking for some help with
the creation of two time savers.

Note: Using ruby 1.8.7 and Watir-webdriver as well as IE 9.

I’m trying to set up some page validation scripts but every attempt has
failed, these run prefectly fine in the program if I repeat them and
fill in linkX and PagetextX with specfics each time but i’d prefer to be
able to run each with a simple bit of code calling the function.
Such as: verify.LinkX(“Terms”)or verify.LinkX(href/ID/etc, “Terms”)
#which would validate a link called Terms.
and verify.PagetextX(“Your info is important”).

Thanks for any help or direction,
TJ

Code samples below.

#First process--------------------------
puts “\n”
puts “Verifying (linkX).”
ie.link(:id, “(linkX)”).exist?
print “Actual Result:”
if ie.text.include? “(linkX)”
puts " Test Passed. Found: ‘LinkX’. Actual Results match expected
Results."
else
puts " Test Failed! Could not find: ‘LinkX’."
end
ie.link(:href, /(linkx)/).click
#Second process-------------------------------
puts “\n”
puts “Checking for Page text ‘(PagetextX)’.”
ie.text.include? “(PagetextX)”
print “Actual Result:”
if ie.text.include? “(PagetextX)”
puts " Test Passed. Found the test string: ‘(PagetextX)’. Actual
Results match expected Results."
else
puts " Test Failed! Could not find: ‘(PagetextX)’."
end

On 10.05.2011 19:32, TJ Wilkes wrote:

able to run each with a simple bit of code calling the function.
Such as: verify.LinkX(“Terms”)or verify.LinkX(href/ID/etc, “Terms”)
#which would validate a link called Terms.
and verify.PagetextX(“Your info is important”).

Thanks for any help or direction,

Sorry, I can’t help you with Watir, but: do you really need to automate
a Browser for this? It seems for simple validation of page content you
could as well read pages (e.g. with net/http or more sophisticated
tools) and process the content (e.g. with Nokogiri).

If your server delivers different pages based on browser type you can
send the appropriate HTTP header to make it believe you are IE 9.

Of course, if you intend to also evaluate JavaScript in pages etc. then
your approach is better. In that case maybe you also want to look at
http://wiki.openqa.org/display/WTR/XPath

Kind regards

robert

TJ Wilkes wrote in post #997808:

Hi I’ve been learning Ruby to help with scripting some tests, but the
books I have are only using mathematical method/class creations and my
attempts to make my own methods are failing. Looking for some help with
the creation of two time savers.

Note: Using ruby 1.8.7 and Watir-webdriver as well as IE 9.

I’m trying to set up some page validation scripts but every attempt has
failed, these run prefectly fine in the program if I repeat them and
fill in linkX and PagetextX with specfics each time

How about an example of that?

my attempts to make my own methods are failing.

We need to see an example of that too.

Your question is very hard to decipher. It appears that you have some
code with a string in it, e.g. linkX, and you don’t understand what a
variable is or how to use one in a string. So here are some examples:

arr = [10, 30, 20]

arr.each do |num|
puts “The number is: #{num}”
end

–output:–
The number is: 10
The number is: 30
The number is: 20

Next, instead of using a variable inside a string, you can also call a
function:

def verify(x)
if x > 15
‘valid’
else
‘invalid’
end
end

arr = [10, 30, 20]

arr.each do |num|
puts “The page is: #{verify(num)}”
end

–output:–
The page is: invalid
The page is: valid
The page is: valid

But sometimes trying to cram too much code in a string can be confusing,
so you could do something like this as well:

def verify(x)
if x > 15
true
else
false
end
end

arr = [10, 30, 20]

arr.each do |num|
print 'The page is: ’

if verify(num)
puts ‘valid’
else
puts ‘invalid’
end
end

–output:–
The page is: invalid
The page is: valid
The page is: valid

You can also ‘interpolate’ variables, or the result of a function call,
into a regex:

def do_stuff
‘hello’
end

if ‘hello world’ =~ /#{do_stuff}/
puts ‘yes’
end

–output:–
yes

7stud – wrote in post #997840:

TJ Wilkes wrote in post #997808:

Hi I’ve been learning Ruby to help with scripting some tests, but the
books I have are only using mathematical method/class creations and my
attempts to make my own methods are failing. Looking for some help with
the creation of two time savers.

Note: Using ruby 1.8.7 and Watir-webdriver as well as IE 9.

I’m trying to set up some page validation scripts but every attempt has
failed, these run prefectly fine in the program if I repeat them and
fill in linkX and PagetextX with specfics each time

How about an example of that?

my attempts to make my own methods are failing.

We need to see an example of that too.

I’ve attached my working code for a short test, when manually putting
pages/links in, so you can see what I’m trying to do.

Below I’ve put what my first attempt for simplifying before I decided to
post a question.

I want to be able to put a method that accepts a string variable and
then runs a process using that string.

Also, thanks to everyone for responding,
-TJ

def verify(x)
print "Verifying ", v, “.”
ie.link(:id, x).exist?
print “Actual Result:”
if ie.text.include? x
puts " Test Passed. Found the test string: ", x, “. Actual Results
match expected Results.”
ie.link(:href, x).click
else
puts " Test Failed! Could not find: ", x, “.”
end
end

TJ Wilkes wrote in post #997849:

def verify(x)
print "Verifying ", v, “.”
ie.link(:id, x).exist?
print “Actual Result:”
if ie.text.include? x
puts " Test Passed. Found the test string: ", x, “. Actual Results
match expected Results.”
ie.link(:href, x).click
else
puts " Test Failed! Could not find: ", x, “.”
end
end

Inside that method, there is no variable called ‘ie’. You either need
to create ie inside the method, or you need to pass ie in as an
argument, like this:

def verify(str, my_ie)
my_ie.link(:id, str).exist?


end

ie = …
verify(‘hello’, ie)

Thanks, that was exactly what I needed.

I ended up with:
def tverify(str, ie)
puts “\n”
print “Checking for text '”, str, “’. "
puts “\n”
print “Actual Result: "
if ie.text.include? str
print " Test Passed. Found the string: '”, str, “’. Valid”
puts “\n”
else
print " !ERROR! Test Failed! Could not find: '”, str, “’.”
puts “\n”
end
end

and

def lifollow(str, ie)
puts “\n”
print "Verifying ", str, “. "
puts “Actual Result:”
if ie.li(:id, str).exist?
print " Found the link: '”, str, “’. Following link.”
puts “\n”
ie.li(:id, str).click
sleep(1)
else
print " Test Failed! Could not find: ", str, “.”
puts “\n”
end
end

Seems to be working perfectly.
Thanks everyone.
-TJ

7stud – wrote in post #997840:

Next, instead of using a variable inside a string, you can also call a
function:

def verify(x)
if x > 15
‘valid’
else
‘invalid’
end
end

And another step, say if the number 15 is a property which you want to
set, is to make a class.

class Verifier
def initialize(threshold)
@threshold = threshold
end

def verify(x)
if x > @threshold
‘valid’
else
‘invalid’
end
end
end

v1 = Verifier.new(15)
puts v1.verify(20)
v2 = Verifier.new(25)
puts v2.verify(20)

The Verifier instance objects, v1 and v2, wrap up the ‘verify’ method
with some state (instance variable @threshold) which can be used when
that method is called.

In your case, you might want to build a class with an @ie instance
variable, so that the methods can have access to @ie without having to
pass it in each time.

Modified with your suggestion:

def tverify(str, ie)
puts “\n”
puts “Checking for text ‘#{str}’.”
print “Actual Result: "
if ie.text.include? str
puts “Test Passed. Found the string: ‘#{str}’. Valid”
else
puts " !ERROR! Test Failed! Could not find: ‘#{str}’.”
end
end

def lifollow(str, ie)
puts “\n”
puts “Verifying ‘#{str}’. "
print “Actual Result:”
if ie.li(:id, str).exist?
puts “Found the link: ‘#{str}’. Following link.”
ie.li(:id, str).click
sleep(1)
else
puts " !ERROR! Test Failed! Could not find: ‘#{str}’.”
end
end

Thanks for the tip.

TJ Wilkes wrote in post #998080:

Thanks, that was exactly what I needed.

I ended up with:
def tverify(str, ie)
puts “\n”
print “Checking for text '”, str, "’. "
puts “\n”

You are doing way too much work with all your print’s and puts
statements. The two lines:

print “Checking for text '”, str, "’. "
puts “\n”

are equivalent to the single line:

puts “Checking for text ‘#{str}’.”

Not only is the single line of code easier to type, the single line of
code is easier to read, which is even more important. Note that the
outer quotes determine if variables will be interpolated, not any inner
quotes.

And if the quotes get too confusing, you can use %q{} for single quotes,
and %Q{} for double quotes, like this:

puts %Q{Checking for text ‘#{str}’.}

TJ Wilkes wrote in post #998101:

Modified with your suggestion:

def tverify(str, ie)
puts “\n”

Some more tips. puts() adds a newline to a string only if it doesn’t
end with a newline already
, so the line:

puts “\n”

is equivalent to just

puts

And these two lines:

puts “\n”
puts “Checking for text ‘#{str}’.”

can also be written like this:

puts “\nChecking for text ‘#{str}’.”

although you often see it written like this:

puts
puts “Checking for text ‘#{str}’.”

…because newlines are not the easiest things to type.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs