<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>test objects design</title>
	<atom:link href="http://www.marekj.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marekj.com</link>
	<description>cooperative software production infrastructure building</description>
	<pubDate>Tue, 05 Aug 2008 16:49:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>IMG_9177</title>
		<link>http://www.marekj.com/2008/08/img_9177/</link>
		<comments>http://www.marekj.com/2008/08/img_9177/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 16:49:27 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/2008/08/img_9177/</guid>
		<description><![CDATA[
.flickr-photo { border: solid 2px #000000; }
.flickr-yourcomment { }
.flickr-frame { text-align: left; padding: 3px; }
.flickr-caption { font-size: 0.8em; margin-top: 0px; }


	

	IMG_9177, from lassekoskela.


]]></description>
			<content:encoded><![CDATA[<style type="text/css">
.flickr-photo { border: solid 2px #000000; }
.flickr-yourcomment { }
.flickr-frame { text-align: left; padding: 3px; }
.flickr-caption { font-size: 0.8em; margin-top: 0px; }
</style>
<div class="flickr-frame">
	<a href="http://www.flickr.com/photos/lassekoskela/2734628193/" title="IMG_9177"><img src="http://farm4.static.flickr.com/3006/2734628193_3ab43efe65.jpg" class="flickr-photo" alt="" /></a><br />
<br />
	<span class="flickr-caption"><a href="http://www.flickr.com/photos/lassekoskela/2734628193/">IMG_9177</a>, from <a href="http://www.flickr.com/people/lassekoskela/">lassekoskela</a>.</span>
</div>
<p class="flickr-yourcomment">
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/08/img_9177/feed/</wfw:commentRss>
		</item>
		<item>
		<title>TinyTutorial: yielding value back to block</title>
		<link>http://www.marekj.com/2008/07/tinytutorial-yielding-value-back-to-block/</link>
		<comments>http://www.marekj.com/2008/07/tinytutorial-yielding-value-back-to-block/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 22:43:19 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/?p=118</guid>
		<description><![CDATA[UPDATE. I guess I will just write on gist.github.com

]]></description>
			<content:encoded><![CDATA[<p>UPDATE. I guess I will just write on gist.github.com</p>
<p><script src="http://gist.github.com/3538.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/07/tinytutorial-yielding-value-back-to-block/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Classes are objects, objects are Classes</title>
		<link>http://www.marekj.com/2008/07/classes-are-objects-objects-are-classes/</link>
		<comments>http://www.marekj.com/2008/07/classes-are-objects-objects-are-classes/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 15:09:23 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[watir]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.marekj.com/?p=117</guid>
		<description><![CDATA[Consider this irb section:
irb(main):003:0&#62; class Bla; end
=&#62; nil
irb(main):004:0&#62; b = Bla.new
=&#62; #
irb(main):005:0&#62; b.class
=&#62; Bla
irb(main):006:0&#62; b.new
NoMethodError: undefined method `new' for #
irb(main):007:0&#62; c = Class.new
=&#62; #
irb(main):008:0&#62; c.new
=&#62; #&#60;#:0x2b5f570&#62;
irb(main):009:0&#62; c.class
=&#62; Class
So, an interesting thing happened here. The variable ‘c’ is an instance of a class Class and you can create another instance of ‘c’ by calling ‘c.new’ however [...]]]></description>
			<content:encoded><![CDATA[<p>Consider this irb section:</p>
<pre>irb(main):003:0&gt; class Bla; end
=&gt; nil
irb(main):004:0&gt; b = Bla.new
=&gt; #
irb(main):005:0&gt; b.class
=&gt; Bla
irb(main):006:0&gt; b.new
NoMethodError: undefined method `new' for #
irb(main):007:0&gt; c = Class.new
=&gt; #
irb(main):008:0&gt; c.new
=&gt; #&lt;#:0x2b5f570&gt;
irb(main):009:0&gt; c.class
=&gt; Class</pre>
<p>So, an interesting thing happened here. The variable ‘c’ is an instance of a class Class and you can create another instance of ‘c’ by calling ‘c.new’ however ‘b’ instance of class Bla tells us ‘undefined method’ when we try to do b.new.</p>
<blockquote><p>Consider this from Ruby for Rails book:</p>
<p>Classes are objects; specifically, they are instances of the class Class (…) When you instantiate the class Class—when you create an instance of it—you’ve created a class. That class, in turn, can create instances of its own (…) class objects are usually stored in constants (…) in the previous example, however, we’ve stored a class in a regular variable When we call the .new method, we send the message new to the class through that variable</p>
<p>And yes, there is a paradox here. <strong>The class Class is an instance of itself; that is, it’s a Class object. And there’s more. Remember the class Object? Well, Object is a class … but classes are objects. So Object is an object. And Class is a class. And Object is a class, and Class is an object.</strong></p>
<p>Which came first? How can the class Class be created unless the class Object already exists? But how can there be a class Object (or any other class) until there’s a class Class of which there can be instances?</p>
<p>The best way to deal with this paradox, at least for now, is to ignore it. Ruby has to do some of this chicken-or-egg stuff in order to get the class and object system up and running—at which point the circularity and paradoxes don’t matter. In the course of programming, you just need to know that classes are objects, and the class of which class-objects are instances is the class called Class.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/07/classes-are-objects-objects-are-classes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>watir 1.5.6 and ruby 1.8.6-26</title>
		<link>http://www.marekj.com/2008/06/watir-156-and-ruby-186-26/</link>
		<comments>http://www.marekj.com/2008/06/watir-156-and-ruby-186-26/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 01:17:41 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/?p=114</guid>
		<description><![CDATA[On one of my Vista machines I just reinstalled ruby using 1.8.6-26 (one click installer) and watir 1.5.6
Of course I will need to reinstall all other gems because they perished when I uninstalled ruby 1.8.4-25 (yes, sometimes it&#8217;s nice to clean up and start again.)
So Ruby 1.8.9-26 bundles gem 0.9.4. I did not update the [...]]]></description>
			<content:encoded><![CDATA[<p>On one of my Vista machines I just reinstalled ruby using 1.8.6-26 (<a href="http://rubyforge.org/frs/download.php/29263/ruby186-26.exe">one click installer</a>) and watir 1.5.6<br />
Of course I will need to reinstall all other gems because they perished when I uninstalled ruby 1.8.4-25 (yes, sometimes it&#8217;s nice to clean up and start again.)</p>
<p>So Ruby 1.8.9-26 bundles gem 0.9.4. I did not update the gem system (I am not sure if I should or not) and then I did &#8216;gem install watir&#8217;. Here is what we get at the prompt.</p>
<pre>C:\Users\marekj&gt;gem -v
0.9.4

C:\Users\marekj&gt;gem install watir
Bulk updating Gem source index for: http://gems.rubyforge.org
Install required dependency win32-process? [Yn]  Y
Install required dependency windows-pr? [Yn]  Y
Install required dependency windows-api? [Yn]  Y
Install required dependency win32-api? [Yn]  Y
Select which gem to install for your platform (i386-mswin32)
 1. win32-api 1.1.0 (ruby)
 2. win32-api 1.1.0 (x86-mswin32-60)
 3. win32-api 1.0.6 (ruby)
 4. win32-api 1.0.6 (x86-mswin32-60)
 5. Skip this gem
 6. Cancel installation
&gt; 2
Install required dependency activesupport? [Yn]  Y
Successfully installed watir-1.5.6
Successfully installed win32-process-0.5.9
Successfully installed windows-pr-0.8.6
Successfully installed windows-api-0.2.3
Successfully installed win32-api-1.1.0-x86-mswin32-60
Successfully installed activesupport-2.1.0
Installing ri documentation for watir-1.5.6&#8230;
Installing ri documentation for win32-process-0.5.9&#8230;
Installing ri documentation for windows-pr-0.8.6&#8230;
Installing ri documentation for windows-api-0.2.3&#8230;
Installing ri documentation for win32-api-1.1.0-x86-mswin32-60&#8230;
Installing ri documentation for activesupport-2.1.0&#8230;
Installing RDoc documentation for watir-1.5.6&#8230;
Installing RDoc documentation for win32-process-0.5.9&#8230;
Installing RDoc documentation for windows-pr-0.8.6&#8230;
Installing RDoc documentation for windows-api-0.2.3&#8230;
Installing RDoc documentation for win32-api-1.1.0-x86-mswin32-60&#8230;
Installing RDoc documentation for activesupport-2.1.0&#8230;

C:\Users\marekj&gt;</pre>
<p>I am just not sure what activesupport is needed for here. which gem needs it? (I will look at gemspecs)</p>
<p>So to summarize - to install watir 1.5.6 I also needed to install 4 more gems: windows-pr-0.8.6, windows-api-0.2.3, win32-api-1.1.0 (x86-mswin32-60) and activesupport-2.1.0</p>
<p>we&#8217;ll dig deeper to make sure installation went great.<br />
next unit tests.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/06/watir-156-and-ruby-186-26/feed/</wfw:commentRss>
		</item>
		<item>
		<title>i can has time tracking! with punch rubygem</title>
		<link>http://www.marekj.com/2008/06/ruby_gem_punch/</link>
		<comments>http://www.marekj.com/2008/06/ruby_gem_punch/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 17:49:02 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/?p=113</guid>
		<description><![CDATA[Just installed rubygem punch (depends on rubygems: main, chronic, attributes, arrayfields, systemu, orderhash) on windows.
and the first try &#8216;puch help I got the error: couldn&#8217;t find HOME environment &#8212; expanding `~&#8217; (ArgumentError). Looks like windows problem&#8230; so on my machine I changed to:
Home = File.expand_path(ENV['USERPROFILE'])
# C:\ruby\lib\ruby\gems\1.8\gems\punch-0.0.2\bin\punch:313
all is well.
]]></description>
			<content:encoded><![CDATA[<p>Just installed rubygem punch (depends on rubygems: main, chronic, attributes, arrayfields, systemu, orderhash) on windows.</p>
<p>and the first try &#8216;puch help I got the error: couldn&#8217;t find HOME environment &#8212; expanding `~&#8217; (ArgumentError). Looks like windows problem&#8230; so on my machine I changed to:</p>
<p>Home = File.expand_path(ENV['USERPROFILE'])</p>
<p># C:\ruby\lib\ruby\gems\1.8\gems\punch-0.0.2\bin\punch:313</p>
<p>all is well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/06/ruby_gem_punch/feed/</wfw:commentRss>
		</item>
		<item>
		<title>assignment to variables from ARGV array on one line</title>
		<link>http://www.marekj.com/2008/06/assignment-to-variables-from-argv-array-on-one-line/</link>
		<comments>http://www.marekj.com/2008/06/assignment-to-variables-from-argv-array-on-one-line/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 04:46:57 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/?p=112</guid>
		<description><![CDATA[I have just discovered that you can do this
# lets say ARGV has 3 items [1, 2, 3]
# the following:
a, b, c = ARGV
# will make this
#=&#62; a=1, b=2, c=3
I didn&#8217;t know you can do this. I just ready it in one of the examples somewhere and I can&#8217;t find it.
Nice way of procesing not [...]]]></description>
			<content:encoded><![CDATA[<p>I have just discovered that you can do this</p>
<pre># lets say ARGV has 3 items [1, 2, 3]
# the following:
a, b, c = ARGV
# will make this
#=&gt; a=1, b=2, c=3</pre>
<p>I didn&#8217;t know you can do this. I just ready it in one of the examples somewhere and I can&#8217;t find it.<br />
Nice way of procesing not only ARGV but other arrays.</p>
<pre>#So, this is how I can ship my data in Watir scripts.
# Write out:
ARGV.clear
ARGV &lt;&lt; 'a1' &lt;&lt; 'b2' &lt;&lt; 'c3' # 

# read from:
a, b, c = ARGV
# of course I could use main gem or other option parsers
# but ARGV is a good simple choice</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/06/assignment-to-variables-from-argv-array-on-one-line/feed/</wfw:commentRss>
		</item>
		<item>
		<title>strategy by delagating to an alias</title>
		<link>http://www.marekj.com/2008/06/strategy-by-delagating-to-an-alias/</link>
		<comments>http://www.marekj.com/2008/06/strategy-by-delagating-to-an-alias/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 22:42:47 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/?p=111</guid>
		<description><![CDATA[I saw this really nice way of setting behaviour. You call a Student object which has a method formal_greeting that delegates to say_hi, but say_hi is aliasing say_hello which calls a superclass since the say_hello of Student is declared below.

class Person
  def say_hello
    puts 'how do you do.'
  end
end

class Student [...]]]></description>
			<content:encoded><![CDATA[<p>I saw this really nice way of setting behaviour. You call a Student object which has a method formal_greeting that delegates to say_hi, but say_hi is aliasing say_hello which calls a superclass since the say_hello of Student is declared below.</p>
<pre class="ruby">
class Person
  def say_hello
    puts 'how do you do.'
  end
end

class Student  Person
end

class Student    # reopening class
  # Assuming Person has a say_hello method...
  alias :say_hi :say_hello #this calls super
  def say_hello
    puts "Hi, there."
  end
  def formal_greeting
    # Say hello the way my superclass would.
    say_hi
  end
end
Student.new.formal_greeting
</pre>
<p>So positioning alias above say_hello definition ensures your call goes up to super class. Am I reading this correctly? if so then this is a nice strategy for designing watir tests depending on configurations needed for your test objects.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/06/strategy-by-delagating-to-an-alias/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Processing defaults in watir elements</title>
		<link>http://www.marekj.com/2008/04/processing-defaults-in-watir-elements/</link>
		<comments>http://www.marekj.com/2008/04/processing-defaults-in-watir-elements/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 16:43:02 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[(method|onto)logy]]></category>

		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/2008/04/25/processing-defaults-in-watir-elements/</guid>
		<description><![CDATA[Looking at watir code there is a nice patterns for accepting defaults for &#8216;how&#8217; in method names for elements. Currently for frame, form and button.
like this: 

I like this solution for my test framework. I have been thinking of making a small change to my snagit screenshot.
Basically be default I want it to take a [...]]]></description>
			<content:encoded><![CDATA[<p>Looking at watir code there is a nice patterns for accepting defaults for &#8216;how&#8217; in method names for elements. Currently for frame, form and button.</p>
<p>like this: </p>
<p><script src="http://gist.github.com/3540.js"></script></p>
<p>I like this solution for my test framework. I have been thinking of making a small change to my snagit screenshot.<br />
Basically be default I want it to take a screenshot of a :desktop but I also want it to snag a webpage with scrolling.<br />
I still need to understand why the how.class is compared to String and not to Symbol.</p>
<p>And on another note I need to start watir.testr.us page for all watir related info in one place. - The Place To Put Things is a constant challenge, it seems.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/04/processing-defaults-in-watir-elements/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Desktop Screenshots with Watir, win32screenshot, RMagick and Snagit</title>
		<link>http://www.marekj.com/2008/04/desktop-screenshots-with-watir-win32screenshot-and-rmagick/</link>
		<comments>http://www.marekj.com/2008/04/desktop-screenshots-with-watir-win32screenshot-and-rmagick/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 21:58:08 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[(method|onto)logy]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://www.marekj.com/2008/04/21/desktop-screenshots-with-watir-win32screenshot-and-rmagick/</guid>
		<description><![CDATA[Here is what I had with win32screenshot and RMagick (later replaced with Snagit)

# Runtime Test Housekeeping place
module TestRun

  # at runtime takes a screenshot of the desktop and saves it in log dir.
  # you must install win32screenshot gem and RMagic package for this to work.
  def self.screenshot(context=nil)
    if [...]]]></description>
			<content:encoded><![CDATA[<p>Here is what I had with win32screenshot and RMagick (later replaced with Snagit)</p>
<pre>
# Runtime Test Housekeeping place
module TestRun

  # at runtime takes a screenshot of the desktop and saves it in log dir.
  # you must install win32screenshot gem and RMagic package for this to work.
  def self.screenshot(context=nil)
    if $testrun[:screenshot] == true
      # prevent runtime error when screenshot gem and RMagic are not installed on client machine.
      begin
        require &#8216;win32screenshot&#8217;
        require &#8216;RMagick&#8217;
        width, height, bitmap = Win32::Screenshot.desktop
        imglist = Magick::ImageList.new
        imgl = imglist.from_blob(bitmap)
        time_stamp_s = Time.new.strftime(&#8217;%m%d_%H%M_%S&#8217;)
        screenshot_filename = context ? &#8220;#{time_stamp_s}_#{context}.png&#8221; : &#8220;#{time_stamp_s}.png&#8221;
        imgl.write(File.join(logpath,screenshot_filename))
        $log.info(&#8221;Screenshot captured: #{screenshot_filename}&#8221;)
      rescue Exception => ex
        $log.error(&#8221;TestRun.screenshot(#{context} &#8212; #{ex}&#8221;)
      end

    end

  end

end

#usage
TestRun.screenshot() # => makes a MMDD_HHMM_SS.png file
TestRun.screenshot(&#8217;blabla&#8217;) # appends the string to filename.
</pre>
<p>The above is an older solution, I&#8217;ve had it working for a while but now it has stopped after I upgraded rubygems system. It still works on my other test machines but not on my primary box. </p>
<p>Instead I have installed <a href="http://www.techsmith.com/screen-capture.asp">snagit 8</a> and I am using it for web page capture. it&#8217;s better, definitely better with the COM interface.<br />
I just wanted to post the code here in case I need to refer to it again in the future. (note: logpath method returns path to log directory. The global $testrun hash holds runtime options for the test framework.</p>
<p>Thanks <a href="http://win32screenshot.rubyforge.org/">win32screenshot </a>and thanks <a href="http://rubyforge.org/projects/rmagick">RMagick</a>, it was fun using it, moving on to snagit OLE interface.</p>
<p>UPDATE:<br />
Here is my current reimplementation using snagit</p>
<pre>
def self.screenshot(context=nil)
    if $testrun[:screenshot] == true #runtime options guard access

      begin
        require &#8216;win32ole&#8217;
        snagit = WIN32OLE.new(&#8217;Snagit.ImageCapture&#8217;)
        time_stamp_s = Time.new.strftime(&#8217;%m%d_%H%M_%S&#8217;)
        screenshot_filename = context ? &#8220;#{time_stamp_s}_#{context}&#8221; : &#8220;#{time_stamp_s}&#8221;
        # config input
        snagit.Input = 0 #desktop
        #configure output
        snagit.Output = 2 #file
        snagit.OutputImageFile2.FileType = 5 #:png
        snagit.OutputImageFile2.FileNamingMethod = 1 # fixed #
        #location
        snagit.OutputImageFile2.Directory = logpath   # set directy where filename will be saved
        snagit.OutputImageFile2.Filename = screenshot_filename
        # do the duty
        snagit.Capture
        # wait for capture to complete
        until snagit.IsCaptureDone do
          sleep 0.5
        end
        $log.info(&#8221;Screenshot captured: #{screenshot_filename}&#8221;)
      rescue Exception => ex
        $log.error(&#8221;TestRun.screenshot(#{context} &#8212; #{ex}&#8221;)
      end
    end
  end
</pre>
<p>The above works pretty well. my next thing is to implement taking a screenshot of a page with setting Input active window and scrolling it. It&#8217;ll be fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/04/desktop-screenshots-with-watir-win32screenshot-and-rmagick/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Doing the Web Test in 3 acts with Watir</title>
		<link>http://www.marekj.com/2008/04/doing-the-web-test-in-3-acts/</link>
		<comments>http://www.marekj.com/2008/04/doing-the-web-test-in-3-acts/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 15:51:56 +0000</pubDate>
		<dc:creator>marekj</dc:creator>
		
		<category><![CDATA[(method|onto)logy]]></category>

		<guid isPermaLink="false">http://www.marekj.com/2008/04/18/doing-the-web-test-in-3-acts/</guid>
		<description><![CDATA[In a Story or UseCase for Web Application you can decompose a test into 3 acts. or Steps. (Actually I don&#8217;t like to speak of Preconditions and Steps. I much rather speak of Context and Acts in a Web Application testing).

class ThreeStepTest
  attr_accessor :context

  # config context for the test
  def initizlie(context)
 [...]]]></description>
			<content:encoded><![CDATA[<p>In a Story or UseCase for Web Application you can decompose a test into 3 acts. or Steps. (Actually I don&#8217;t like to speak of Preconditions and Steps. I much rather speak of Context and Acts in a Web Application testing).</p>
<pre>
class ThreeStepTest
  attr_accessor :context

  # config context for the test
  def initizlie(context)
     @context = context
  end

  # act one
  def set_request
    # given context configure the page with data.
    # Delegate to watir implementer here to send data to the page.
  end

  # act two
  def submit_request
    # delegate to watir to click on a page to submit form or request next page
  end

  # act three
  def verify_response
    # get context
    @context =
  end
end

class Context
  attr_accessor :given, :expected, :actual

end
</pre>
<p>the set_request occurs in a Given Context which was created by the previous verify_response. </p>
<p>So a test scenario can be constructed a series of those 3 acts. Context has a :given as a precondition to start with, :expected and :actual. </p>
<p>Anyway, this is just some thinking about constructing Watir framework</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marekj.com/2008/04/doing-the-web-test-in-3-acts/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
