Cucumber: Upload file to system

I’m working on a project to practice test automation. So, I’ve choose WordPress.org framework and integrated cucumber + selenium web driver.

New Media Feature:

Feature Screenshot:

Screen Shot 2015-01-26 at 10.27.52 PM

Html Source Code:

<<span class="pl-ent">p</span> <span class="pl-e">id</span>=<span class="pl-s1"><span class="pl-pds">"</span>async-upload-wrap<span class="pl-pds">"</span></span>></div>
<div id="file-upload-html-LC2" class="line"><<span class="pl-ent">label</span> <span class="pl-e">for</span>=<span class="pl-s1"><span class="pl-pds">"</span>async-upload<span class="pl-pds">"</span></span> <span class="pl-e">class</span>=<span class="pl-s1"><span class="pl-pds">"</span>screen-reader-text<span class="pl-pds">"</span></span>>Upload</<span class="pl-ent">label</span>></div>
<div id="file-upload-html-LC3" class="line"><<span class="pl-ent">input</span> <span class="pl-e">type</span>=<span class="pl-s1"><span class="pl-pds">"</span>file<span class="pl-pds">"</span></span> <span class="pl-e">id</span>=<span class="pl-s1"><span class="pl-pds">"</span>async-upload<span class="pl-pds">"</span></span> <span class="pl-e">name</span>=<span class="pl-s1"><span class="pl-pds">"</span>async-upload<span class="pl-pds">"</span></span>></div>
<div id="file-upload-html-LC4" class="line"><<span class="pl-ent">input</span> <span class="pl-e">type</span>=<span class="pl-s1"><span class="pl-pds">"</span>submit<span class="pl-pds">"</span></span> <span class="pl-e">value</span>=<span class="pl-s1"><span class="pl-pds">"</span>Upload<span class="pl-pds">"</span></span> <span class="pl-e">class</span>=<span class="pl-s1"><span class="pl-pds">"</span>button<span class="pl-pds">"</span></span> <span class="pl-e">id</span>=<span class="pl-s1"><span class="pl-pds">"</span>html-upload<span class="pl-pds">"</span></span> <span class="pl-e">name</span>=<span class="pl-s1"><span class="pl-pds">"</span>html-upload<span class="pl-pds">"</span></span>></div>
<div id="file-upload-html-LC5" class="line"><<span class="pl-ent">a</span> <span class="pl-e">onclick</span>=<span class="pl-s1"><span class="pl-pds">"</span>try{top.tb_remove();}catch(e){}; return false;<span class="pl-pds">"</span></span> <span class="pl-e">href</span>=<span class="pl-s1"><span class="pl-pds">"</span>#<span class="pl-pds">"</span></span>>Cancel</<span class="pl-ent">a</span>></div>
<div id="file-upload-html-LC6" class="line"></<span class="pl-ent">p</span>></div>
<div class="line"></div>
<div id="file-upload-html-LC7" class="line">

Now, in step definitions I can write this – to directly show the local file (images, pdf, locations)

Step_definitions:

</div>
<div class="line">When "I upload a file" do</div>
<div id="file-upload_steps-LC2" class="line">attach_file('file','features/upload_files/theme-unit-test-data.xml')</div>
<div id="file-upload_steps-LC3" class="line">end</div>
<div class="line">
 Media-lib.feature
</div>
<div class="line">When I upload a file</div>
</div>
<div class="line">

It works as we have type=”file” and finds and system uploads file to system

Now if we go that way, sometimes it will not work. If we look that source code

Importing XML File:

Screen Shot 2015-01-26 at 10.35.32 PM

Source Code Html:

</div>
<p>
<label for="upload">Choose a file from your computer:</label> (Maximum size: 32 MB)
<input type="file" size="25" name="import" id="upload">
<input type="hidden" value="save" name="action">
<input type="hidden" value="33554432" name="max_file_size">
</p>

Now, in that case, I found it go confused and I needed generic solution to test.

Step definitions:


When /^I upload a "(.+)" file with "(.+)" and located at "(.+)"$/ do |file_name, name_selector, path|
attach_file(name_selector, "#{path}/#{file_name}")
end

Upload.features

And I upload a "theme-unit-test-data.xml" file with "file" and located at "/Users/sakib/Documents/projects/wp-automation/features/upload_files"

Pre-requirement:

  • WordPress.org (Configured and execute on local server)
  • Cucumber
  • Capybara