Module: RWebSpec::WebDriver::Driver
- Includes:
- Popup, TestWisePlugin
- Included in:
- AbstractWebPage, LoadTestHelper, RSpecHelper, TestScript, WebTestCase
- Defined in:
- lib/rwebspec-webdriver/driver.rb
Instance Method Summary collapse
-
#absolutify_url(src, base_url, parent_url) ⇒ Object
change <script type=“text/javascript” src=“/javascripts/prototype.js”></script> to <script type=“text/javascript” src=“itest2.com/javascripts/prototype.js”></script>.
-
#absolutize_page(content, base_url, current_url_parent) ⇒ Object
<link rel=“stylesheet” type=“text/css” href=“/stylesheets/default.css” /> ‘<script type=“text/javascript” src=“www.jeroenwijering.com/embed/swfobject.js”></script>’ <script type=“text/javascript” src=“/javascripts/prototype.js”></script> <script type=“text/javascript” src=“/javascripts/scriptaculous.js?load=effects,builder”></script> <script type=“text/javascript” src=“/javascripts/extensions/gallery/lightbox.js”></script> <link href=“/stylesheets/extensions/gallery/lightbox.css” rel=“stylesheet” type=“text/css” /> <img src=“images/mission_48.png” />.
-
#absolutize_page_hpricot(content, base_url, parent_url) ⇒ Object
absolutize_page referencs using hpricot.
-
#ajax_wait_for_element(element_id, seconds, status = 'show', check_interval = $testwise_polling_interval) ⇒ Object
Wait for specific seconds for an Ajax update finish.
-
#attach_browser(how, what, options = {}) ⇒ Object
Attach to existinb browser window.
- #basic_authentication(username, password, options = {}) ⇒ Object
- #basic_authentication_celerity(username, password) ⇒ Object
-
#basic_authentication_firefox(username, password, wait = 3) ⇒ Object
Use JSSH to pass authentication Window title “Authentication required”.
-
#basic_authentication_ie(title, username, password, options = {}) ⇒ Object
Use AutoIT3 to send password title starts with “Connect to …”.
-
#begin_at(url) ⇒ Object
Starting browser with a URL.
-
#browser ⇒ Object
return the underlying RWebSpec::WebDriver::Browser object.
-
#cell_with_id(cell_id, options = {}) ⇒ Object
(also: #table_data_with_id)
return the text of specific (identified by attribute “id”) ta tag For page containing <td id=“preferred_recorder”>iTest2/Watir Recorder</span> td_with_id(“preferred_recorder”) # => iTest2/Watir Recorder.
- #check_ie_version ⇒ Object
- #choose_file_dialog(file_path) ⇒ Object
-
#clear_popup(popup_win_title, seconds = 10, yes = true) ⇒ Object
Clear popup windows such as ‘Security Alert’ or ‘Security Information’ popup window,.
-
#click_button_with_image_src_contains(image_filename) ⇒ Object
(also: #click_button_with_image)
Click image buttion with image source name.
-
#close_all_browsers ⇒ Object
Close all opening browser windows.
-
#close_browser ⇒ Object
(also: #close_ie)
Close the current browser window (started by the script).
-
#contains(str) ⇒ Object
(also: #contain)
In pages, can’t use include, text.should include(“abc”) won’t work Instead, text.should contains(“abc”.
- #contains_text(text) ⇒ Object
- #context ⇒ Object
- #default_dump_dir ⇒ Object
-
#dump_response(stream = nil) ⇒ Object
— For debugging —.
-
#element_by_id(elem_id) ⇒ Object
Identify DOM element by ID Warning: it is only supported on IE.
-
#element_text(elem_id) ⇒ Object
Warning: this does not work well with Firefox yet.
- #ends_with?(str, suffix) ⇒ Boolean
-
#enter_text_with_id(textfield_id, value) ⇒ Object
for text field can be easier to be identified by attribute “id” instead of “name”, not recommended though.
-
#expect_page(page_clazz, argument = nil) ⇒ Object
Verify the next page following an operation.
- #find_element(how, what) ⇒ Object
- #find_elements(how, what) ⇒ Object
-
#firefox ⇒ Object
Return the FireWatir::Firefox instance.
-
#goto_page(page) ⇒ Object
(also: #visit)
Go to another page on the testing site.
-
#goto_url(url) ⇒ Object
Go to another web site, normally different site being tested on.
-
#ie ⇒ Object
Return the Watir::IE instance.
- #is_firefox? ⇒ Boolean
- #is_htmlunit? ⇒ Boolean
- #is_ie? ⇒ Boolean
- #is_linux? ⇒ Boolean
- #is_mac? ⇒ Boolean
- #is_windows? ⇒ Boolean
-
#label_with_id(label_id, options = {}) ⇒ Object
return the text of specific (identified by attribute “id”) label tag For page containing <label id=“preferred_ide”>TestWise</label> label_with_id(“preferred_ids”) # => TestWise label_with_id(“preferred_ids”, :index => 2) # => TestWise.
- #new_popup_window(options) ⇒ Object
-
#open_browser(base_url = nil, options = {}) ⇒ Object
(also: #open_browser_with)
open a browser, and set base_url via hash, but does not acually.
-
#page_source ⇒ Object
current page source (in HTML).
-
#page_text ⇒ Object
return plain text view of page.
-
#page_title ⇒ Object
current web page title.
- #perform_operation(&block) ⇒ Object
- #quit ⇒ Object
-
#save_current_page(options = {}) ⇒ Object
For current page souce to a file in specified folder for inspection.
- #select_file_for_upload(file_field_name, file_path) ⇒ Object
-
#span_with_id(span_id, options = {}) ⇒ Object
return the text of specific (identified by attribute “id”) span tag For page containing <span id=“preferred_recorder”>iTest2/Watir Recorder</span> span_with_id(“preferred_recorder”) # => iTest2/Watir Recorder.
-
#substitute_relative_path_in_src_line(line, script_src, host_url, page_parent_url) ⇒ Object
substut.
-
#support_utf8 ⇒ Object
(also: #support_unicode)
Support browser (IE) operations using unicode Example: click_button(“Google 搜索”) Reference: jira.openqa.org/browse/WTR-219.
-
#use_current_browser(how = :title, what = /.*/) ⇒ Object
Reuse current an opened browser window instead of opening a new one example: use_current_browser(:title, /.*/) # use what ever browser window use_current_browser(:title, “TestWise”) # use browser window with title “TestWise”.
-
#wait_for_element(element_id, timeout = $testwise_polling_timeout, interval = $testwise_polling_interval) ⇒ Object
Wait the element with given id to be present in web page.
-
#wait_until(timeout = $testwise_polling_timeout || 30, polling_interval = $testwise_polling_interval || 1, &block) ⇒ Object
Execute the provided block until either (1) it returns true, or (2) the timeout (in seconds) has been reached.
Methods included from Popup
#check_for_popups, #check_for_security_alerts, #click_button_in_javascript_popup, #click_button_in_popup_after, #click_button_in_security_alert_popup, #click_button_in_security_information_popup, #click_popup_window, #ie_popup_clicker, #prepare_to_click_button_in_popup, #start_checking_js_dialog, #verify_alert
Methods included from TestWisePlugin
#check_for_pause, #connect_to_testwise, #debug, #dump_caller_stack, #notify_screenshot_location, #operation_delay
Instance Method Details
#absolutify_url(src, base_url, parent_url) ⇒ Object
change
<script type="text/javascript" src="/javascripts/prototype.js"></script>
to
<script type="text/javascript" src="http://itest2.com/javascripts/prototype.js"></script>
481 482 483 484 485 486 487 488 489 |
# File 'lib/rwebspec-webdriver/driver.rb', line 481 def absolutify_url(src, base_url, parent_url) if src.nil? || src.empty? || src == "//:" || src =~ /\s*http:\/\//i return src end return "#{base_url}#{src}" if src =~ /^\s*\// return "#{parent_url}#{src}" if parent_url return src end |
#absolutize_page(content, base_url, current_url_parent) ⇒ Object
<link rel=“stylesheet” type=“text/css” href=“/stylesheets/default.css” /> ‘<script type=“text/javascript” src=“www.jeroenwijering.com/embed/swfobject.js”></script>’ <script type=“text/javascript” src=“/javascripts/prototype.js”></script> <script type=“text/javascript” src=“/javascripts/scriptaculous.js?load=effects,builder”></script> <script type=“text/javascript” src=“/javascripts/extensions/gallery/lightbox.js”></script> <link href=“/stylesheets/extensions/gallery/lightbox.css” rel=“stylesheet” type=“text/css” /> <img src=“images/mission_48.png” />
440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 |
# File 'lib/rwebspec-webdriver/driver.rb', line 440 def absolutize_page(content, base_url, current_url_parent) modified_content = "" content.each_line do |line| if line =~ /<script\s+.*src=["'']?(.*)["'].*/i then script_src = $1 substitute_relative_path_in_src_line(line, script_src, base_url, current_url_parent) elsif line =~ /<link\s+.*href=["'']?(.*)["'].*/i then link_href = $1 substitute_relative_path_in_src_line(line, link_href, base_url, current_url_parent) elsif line =~ /<img\s+.*src=["'']?(.*)["'].*/i then img_src = $1 substitute_relative_path_in_src_line(line, img_src, base_url, current_url_parent) end modified_content += line end return modified_content end |
#absolutize_page_hpricot(content, base_url, parent_url) ⇒ Object
absolutize_page referencs using hpricot
461 462 463 464 465 466 467 468 469 470 471 472 473 474 |
# File 'lib/rwebspec-webdriver/driver.rb', line 461 def absolutize_page_hpricot(content, base_url, parent_url) return absolutize_page(content, base_url, parent_url) if RUBY_PLATFORM == 'java' begin require 'nokogiri' doc = Nokogiri::HTML(content) base_url.slice!(-1) if ends_with?(base_url, "/") (doc/'link').each { |e| e['href'] = absolutify_url(e['href'], base_url, parent_url) || "" } (doc/'img').each { |e| e['src'] = absolutify_url(e['src'], base_url, parent_url) || "" } (doc/'script').each { |e| e['src'] = absolutify_url(e['src'], base_url, parent_url) || "" } return doc.to_html rescue => e absolutize_page(content, base_url, parent_url) end end |
#ajax_wait_for_element(element_id, seconds, status = 'show', check_interval = $testwise_polling_interval) ⇒ Object
Wait for specific seconds for an Ajax update finish. Trick: In your Rails application,
:loading => "Element.show('search_indicator');
:complete => "Element.hide('search_indicator');
<%= image_tag("indicator.gif", :id => 'search_indicator', :style => 'display:none') %>
Typical usage:
ajax_wait_for_element("search_indicator", 30)
ajax_wait_for_element("search_indicator", 30, "show")
ajax_wait_for_element("search_indicator", 30, "hide")
ajax_wait_for_element("search_indicator", 30, "show", 5) # check every 5 seconds
Warning: this method has not been fully tested, if you are not using Rails, change your parameter accordingly.
636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 |
# File 'lib/rwebspec-webdriver/driver.rb', line 636 def ajax_wait_for_element(element_id, seconds, status='show', check_interval = $testwise_polling_interval) count = 0 check_interval = 1 if check_interval < 1 or check_interval > seconds while count < (seconds / check_interval) do search_indicator = @web_browser.element_by_id(element_id) search_indicator_outer_html = search_indicator.outerHtml if search_indicator if status == 'hide' return true if search_indicator_outer_html and !search_indicator_outer_html.include?('style="DISPLAY: none"') else return true if search_indicator_outer_html and search_indicator_outer_html.include?('style="DISPLAY: none"') end sleep check_interval if check_interval > 0 and check_interval < 5 * 60 # wait max 5 minutes count += 1 end return false end |
#attach_browser(how, what, options = {}) ⇒ Object
Attach to existinb browser window
attach_browser(:title, )
207 208 209 210 211 212 213 214 215 216 |
# File 'lib/rwebspec-webdriver/driver.rb', line 207 def attach_browser(how, what, = {}) #TODO .merge!(:browser => is_firefox? ? "Firefox" : "IE") unless [:browser] begin .merge!(:base_url => browser.context.base_url) rescue => e puts "failed to set base_url, ignore : #{e}" end WebBrowser.attach_browser(how, what, ) end |
#basic_authentication(username, password, options = {}) ⇒ Object
829 830 831 832 833 834 835 836 837 |
# File 'lib/rwebspec-webdriver/driver.rb', line 829 def basic_authentication(username, password, = {}) if is_celerity? basic_authentication_celerity(username, password) elsif is_firefox? basic_authentication_firefox(username, password) else basic_authentication_ie([:title], username, password, ) end end |
#basic_authentication_celerity(username, password) ⇒ Object
825 826 827 |
# File 'lib/rwebspec-webdriver/driver.rb', line 825 def basic_authentication_celerity(username, password) @web_browser.celerity.credentials = "#{username}:#{password}" end |
#basic_authentication_firefox(username, password, wait = 3) ⇒ Object
Use JSSH to pass authentication
Window title "Authentication required"
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 |
# File 'lib/rwebspec-webdriver/driver.rb', line 800 def basic_authentication_firefox(username, password, wait = 3) jssh_command = " var length = getWindows().length; var win; var found = false; for (var i = 0; i < length; i++) { win = getWindows()[i]; if(win.document.title == \"Authentication Required\") { found = true; break; } } if (found) { var jsdocument = win.document; var dialog = jsdocument.getElementsByTagName(\"dialog\")[0]; jsdocument.getElementsByTagName(\"textbox\")[0].value = \"#{username}\"; jsdocument.getElementsByTagName(\"textbox\")[1].value = \"#{password}\"; dialog.getButton(\"accept\").click(); } \n" sleep(wait) $jssh_socket.send(jssh_command, 0) # read_socket() end |
#basic_authentication_ie(title, username, password, options = {}) ⇒ Object
Use AutoIT3 to send password title starts with “Connect to …”
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 |
# File 'lib/rwebspec-webdriver/driver.rb', line 777 def basic_authentication_ie(title, username, password, = {}) = {:textctrl_username => "Edit2", :textctrl_password => "Edit3", :button_ok => 'Button1' } = .merge() title ||= "" if title =~ /^Connect\sto/ full_title = title else full_title = "Connect to #{title}" end require 'rformspec' login_win = RFormSpec::Window.new(full_title) login_win.send_control_text([:textctrl_username], username) login_win.send_control_text([:textctrl_password], password) login_win.("OK") end |
#begin_at(url) ⇒ Object
Starting browser with a URL
Example:
begin_at("http://www.itest2.com")
153 154 155 156 157 |
# File 'lib/rwebspec-webdriver/driver.rb', line 153 def begin_at(url) # puts "[DEBUG] [SeleniumBrowser] begin_at #{url}" dump_caller_stack @web_browser.begin_at(url) end |
#browser ⇒ Object
return the underlying RWebSpec::WebDriver::Browser object
93 94 95 |
# File 'lib/rwebspec-webdriver/driver.rb', line 93 def browser @web_browser end |
#cell_with_id(cell_id, options = {}) ⇒ Object Also known as: table_data_with_id
return the text of specific (identified by attribute “id”) ta tag For page containing
<td id="preferred_recorder">iTest2/Watir Recorder</span>
td_with_id(“preferred_recorder”) # => iTest2/Watir Recorder
555 556 557 558 559 560 561 562 |
# File 'lib/rwebspec-webdriver/driver.rb', line 555 def cell_with_id(cell_id, = {}) if && [:index] then elements = find_elements(:id, cell_id.to_s) elements[[:index].to_i - 1].text else find_element(:id, cell_id.to_s).text end end |
#check_ie_version ⇒ Object
755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 |
# File 'lib/rwebspec-webdriver/driver.rb', line 755 def check_ie_version if is_windows? && @ie_version.nil? begin cmd = 'reg query "HKLM\SOFTWARE\Microsoft\Internet Explorer" /v Version'; result = `#{cmd}` version_line = nil result.each do |line| if (line =~ /Version\s+REG_SZ\s+([\d\.]+)/) version_line = $1 end end if version_line =~ /^\s*(\d+)\./ @ie_version = $1.to_i end rescue => e end end end |
#choose_file_dialog(file_path) ⇒ Object
749 750 751 752 753 |
# File 'lib/rwebspec-webdriver/driver.rb', line 749 def choose_file_dialog(file_path) Watir.autoit.WinWaitActive("Choose File to Upload", '', 10) Watir.autoit.ControlSetText("Choose File to Upload", "", 1148, file_path) Watir.autoit.ControlClick("Choose File to Upload", "", "&Open") end |
#clear_popup(popup_win_title, seconds = 10, yes = true) ⇒ Object
Clear popup windows such as ‘Security Alert’ or ‘Security Information’ popup window,
Screenshot see kb2.adobe.com/cps/165/tn_16588.html
You can also by pass security alerts by change IE setting, kb.iu.edu/data/amuj.html
Example
clear_popup("Security Information", 5, true) # check for Security Information for 5 seconds, click Yes
709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 |
# File 'lib/rwebspec-webdriver/driver.rb', line 709 def clear_popup(popup_win_title, seconds = 10, yes = true) # commonly "Security Alert", "Security Information" if is_windows? sleep 1 autoit = WIN32OLE.new('AutoItX3.Control') # Look for window with given title. Give up after 1 second. ret = autoit.WinWait(popup_win_title, '', seconds) # # If window found, send appropriate keystroke (e.g. {enter}, {Y}, {N}). if ret == 1 then puts "about to send click Yes" if debugging? = yes ? "Button1" : "Button2" # Yes or No autoit.ControlClick(popup_win_title, '', ) end sleep(0.5) else raise "Currently supported only on Windows" end end |
#click_button_with_image_src_contains(image_filename) ⇒ Object Also known as:
Click image buttion with image source name
For an image submit button <input name=“submit” type=“image” src=“/images/search_button.gif”>
("search_button.gif")
357 358 359 360 361 |
# File 'lib/rwebspec-webdriver/driver.rb', line 357 def (image_filename) perform_operation { @web_browser.(image_filename) } end |
#close_all_browsers ⇒ Object
Close all opening browser windows
127 128 129 130 |
# File 'lib/rwebspec-webdriver/driver.rb', line 127 def close_all_browsers #TODO close_browser end |
#close_browser ⇒ Object Also known as: close_ie
Close the current browser window (started by the script). If no browser started, then close all browser windows.
113 114 115 116 117 118 119 120 121 |
# File 'lib/rwebspec-webdriver/driver.rb', line 113 def close_browser if @web_browser # Old TestWise version # @web_browser.close_browser unless $TESTWISE_LEAVE_BROWSER_OPEN_AFTER_RUN @web_browser.close_browser else WebBrowser.close_all_browsers end end |
#contains(str) ⇒ Object Also known as: contain
In pages, can’t use include, text.should include(“abc”) won’t work Instead,
text.should contains("abc"
347 348 349 |
# File 'lib/rwebspec-webdriver/driver.rb', line 347 def contains(str) ContainsText.new(str) end |
#contains_text(text) ⇒ Object
340 341 342 |
# File 'lib/rwebspec-webdriver/driver.rb', line 340 def contains_text(text) @web_browser.contains_text(text) end |
#context ⇒ Object
145 146 147 |
# File 'lib/rwebspec-webdriver/driver.rb', line 145 def context @web_browser.context end |
#default_dump_dir ⇒ Object
388 389 390 391 392 393 394 395 396 397 398 399 400 |
# File 'lib/rwebspec-webdriver/driver.rb', line 388 def default_dump_dir if $TESTWISE_RUNNING_SPEC_ID && $TESTWISE_WORKING_DIR $TESTWISE_DUMP_DIR = File.join($TESTWISE_WORKING_DIR, "dump") FileUtils.mkdir($TESTWISE_DUMP_DIR) unless File.exists?($TESTWISE_DUMP_DIR) spec_run_id = $TESTWISE_RUNNING_SPEC_ID spec_run_dir_name = spec_run_id.to_s.rjust(4, "0") unless spec_run_id == "unknown" to_dir = File.join($TESTWISE_DUMP_DIR, spec_run_dir_name) else to_dir = ENV['TEMP_DIR'] || (is_windows? ? "C:\\temp" : "/tmp") end end |
#dump_response(stream = nil) ⇒ Object
For debugging
384 385 386 |
# File 'lib/rwebspec-webdriver/driver.rb', line 384 def dump_response(stream = nil) @web_browser.dump_response(stream) end |
#element_by_id(elem_id) ⇒ Object
Identify DOM element by ID Warning: it is only supported on IE
377 378 379 |
# File 'lib/rwebspec-webdriver/driver.rb', line 377 def element_by_id(elem_id) @web_browser.element_by_id(elem_id) end |
#element_text(elem_id) ⇒ Object
Warning: this does not work well with Firefox yet.
371 372 373 |
# File 'lib/rwebspec-webdriver/driver.rb', line 371 def element_text(elem_id) @web_browser.element_value(elem_id) end |
#ends_with?(str, suffix) ⇒ Boolean
503 504 505 506 |
# File 'lib/rwebspec-webdriver/driver.rb', line 503 def ends_with?(str, suffix) suffix = suffix.to_s str[-suffix.length, suffix.length] == suffix end |
#enter_text_with_id(textfield_id, value) ⇒ Object
for text field can be easier to be identified by attribute “id” instead of “name”, not recommended though
314 315 316 317 318 319 320 321 322 323 324 |
# File 'lib/rwebspec-webdriver/driver.rb', line 314 def enter_text_with_id(textfield_id, value) perform_operation { elements = find_elements(:id, textfield_id) if elements.size == 1 then elements[0].send_keys(value) else smaller_set = elements.select {|x| x.tag_name == "textarea" || (x.tag_name == "input" && x.attribute("text")) } smaller_set[0].send_keys(value) end } end |
#expect_page(page_clazz, argument = nil) ⇒ Object
Verify the next page following an operation.
Typical usage:
login_page.click_login
expect_page HomePage
137 138 139 140 141 142 143 |
# File 'lib/rwebspec-webdriver/driver.rb', line 137 def expect_page(page_clazz, argument = nil) if argument @web_browser.expect_page(page_clazz, argument) else @web_browser.expect_page(page_clazz) end end |
#find_element(how, what) ⇒ Object
102 103 104 |
# File 'lib/rwebspec-webdriver/driver.rb', line 102 def find_element(how, what) @web_browser.find_element(how, what) end |
#find_elements(how, what) ⇒ Object
106 107 108 |
# File 'lib/rwebspec-webdriver/driver.rb', line 106 def find_elements(how, what) @web_browser.find_elements(how, what) end |
#firefox ⇒ Object
Return the FireWatir::Firefox instance
167 168 169 |
# File 'lib/rwebspec-webdriver/driver.rb', line 167 def firefox @web_browser.firefox end |
#goto_page(page) ⇒ Object Also known as: visit
Go to another page on the testing site.
open_browser("http://www.itest2.com")
goto_page("/demo") # visit page http://www.itest2.com/demo
188 189 190 191 192 |
# File 'lib/rwebspec-webdriver/driver.rb', line 188 def goto_page(page) perform_operation { @web_browser.goto_page(page) if @web_browser } end |
#goto_url(url) ⇒ Object
Go to another web site, normally different site being tested on
open_browser("http://www.itest2.com")
goto_url("http://myorganized.info")
199 200 201 202 |
# File 'lib/rwebspec-webdriver/driver.rb', line 199 def goto_url(url) puts "Calling web_browser goto: #{@web_browser.inspect}" @web_browser.goto_url url end |
#ie ⇒ Object
Return the Watir::IE instance
161 162 163 |
# File 'lib/rwebspec-webdriver/driver.rb', line 161 def ie @web_browser.ie end |
#is_firefox? ⇒ Boolean
171 172 173 |
# File 'lib/rwebspec-webdriver/driver.rb', line 171 def is_firefox? @web_browser.is_firefox? if @web_browser end |
#is_htmlunit? ⇒ Boolean
179 180 181 |
# File 'lib/rwebspec-webdriver/driver.rb', line 179 def is_htmlunit? RUBY_PLATFORM =~ /java/ && @web_browser end |
#is_ie? ⇒ Boolean
175 176 177 |
# File 'lib/rwebspec-webdriver/driver.rb', line 175 def is_ie? @web_browser.is_ie? if @web_browser end |
#is_linux? ⇒ Boolean
574 575 576 |
# File 'lib/rwebspec-webdriver/driver.rb', line 574 def is_linux? RUBY_PLATFORM.downcase.include?("linux") end |
#is_mac? ⇒ Boolean
566 567 568 |
# File 'lib/rwebspec-webdriver/driver.rb', line 566 def is_mac? RUBY_PLATFORM.downcase.include?("darwin") end |
#is_windows? ⇒ Boolean
570 571 572 |
# File 'lib/rwebspec-webdriver/driver.rb', line 570 def is_windows? RUBY_PLATFORM.downcase.include?("mswin") or RUBY_PLATFORM.downcase.include?("mingw") end |
#label_with_id(label_id, options = {}) ⇒ Object
return the text of specific (identified by attribute “id”) label tag For page containing
<label id="preferred_ide">TestWise</label>
label_with_id(“preferred_ids”) # => TestWise label_with_id(“preferred_ids”, :index => 2) # => TestWise
528 529 530 531 532 533 534 535 536 |
# File 'lib/rwebspec-webdriver/driver.rb', line 528 def label_with_id(label_id, = {}) if && [:index] then elements = find_elements(:id, label_id.to_s) elements[[:index].to_i - 1].text # label(:id => label_id.to_s, :index => options[:index]).text else find_element(:id, label_id.to_s).text end end |
#new_popup_window(options) ⇒ Object
365 366 367 |
# File 'lib/rwebspec-webdriver/driver.rb', line 365 def new_popup_window() @web_browser.new_popup_window() end |
#open_browser(base_url = nil, options = {}) ⇒ Object Also known as: open_browser_with
open a browser, and set base_url via hash, but does not acually
example:
open_browser :base_url => http://localhost:8080
There are 3 ways to set base url
1. pass as first argument
2. If running using TestWise, used as confiured
3. Use default value set
New Options:
:browser => :ie | :firefox | :chrome
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/rwebspec-webdriver/driver.rb', line 35 def open_browser(base_url = nil, = {}) # puts "[DEBUG] [SeleniumDriver] Callling open_browser #{base_url}" begin support_unicode rescue => e puts "Unicode may not work in IE, #{e}" end base_url ||= $TESTWISE_PROJECT_BASE_URL base_url ||= $BASE_URL raise "base_url must be set" if base_url.nil? = {:speed => "fast", :visible => true, :highlight_colour => 'yellow', :close_others => true, :start_new => true, # start a new browser always :go => true } = .merge if $TESTWISE_BROWSER [:browser] = $TESTWISE_BROWSER.downcase end if [:firefox] && [:browser].nil? then [:browser] = "firefox" # legacy end if base_url =~ /^file:/ uri_base = base_url else uri = URI.parse(base_url) uri_base = "#{uri.scheme}://#{uri.host}:#{uri.port}" end if [:start_new] # puts "[DEBUG] [SeleniumBrowser] creating a new browser" @web_browser = WebBrowser.new(uri_base, nil, ) # puts "[DEBUG] [SeleniumBrowser] browser: #{@web_browser.inspect}" else @web_browser = WebBrowser.reuse(uri_base, ) # Reuse existing browser end if base_url =~ /^file:/ goto_url(base_url) # for files, no base url else (uri.path.length == 0) ? begin_at(base_url) : begin_at(uri.path) if [:go] end # remembering browser handle for debugging need $browser = @web_browser return @web_browser end |
#page_source ⇒ Object
current page source (in HTML)
514 515 516 |
# File 'lib/rwebspec-webdriver/driver.rb', line 514 def page_source @web_browser.page_source end |
#page_text ⇒ Object
return plain text view of page
519 520 521 |
# File 'lib/rwebspec-webdriver/driver.rb', line 519 def page_text @web_browser.text end |
#page_title ⇒ Object
current web page title
509 510 511 |
# File 'lib/rwebspec-webdriver/driver.rb', line 509 def page_title @web_browser.page_title end |
#perform_operation(&block) ⇒ Object
326 327 328 329 330 331 332 333 334 335 336 337 338 |
# File 'lib/rwebspec-webdriver/driver.rb', line 326 def perform_operation(& block) begin dump_caller_stack operation_delay check_for_pause yield rescue RuntimeError => re puts "[DEBUG] operation error: #{re}" raise re # ensure # puts "[DEBUG] ensure #{perform_ok}" unless perform_ok end end |
#quit ⇒ Object
98 99 100 |
# File 'lib/rwebspec-webdriver/driver.rb', line 98 def quit @web_browser.quit end |
#save_current_page(options = {}) ⇒ Object
For current page souce to a file in specified folder for inspection
save_current_page(:dir => "C:\\mysite", filename => "abc", :replacement => true)
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 |
# File 'lib/rwebspec-webdriver/driver.rb', line 405 def save_current_page( = {}) = {:replacement => true} = .merge() to_dir = [:dir] || default_dump_dir if [:filename] file_name = [:filename] else file_name = Time.now.strftime("%m%d%H%M%S") + ".html" end Dir.mkdir(to_dir) unless File.exists?(to_dir) file = File.join(to_dir, file_name) content = page_source base_url = @web_browser.context.base_url current_url = @web_browser.url current_url =~ /(.*\/).*$/ current_url_parent = $1 if [:replacement] && base_url =~ /^http:/ File.new(file, "w").puts absolutize_page_hpricot(content, base_url, current_url_parent) else File.new(file, "w").puts content end end |
#select_file_for_upload(file_field_name, file_path) ⇒ Object
729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 |
# File 'lib/rwebspec-webdriver/driver.rb', line 729 def select_file_for_upload(file_field_name, file_path) =begin if is_windows? normalized_file_path = file_path.gsub("/", "\\") if $support_ie8 && check_ie_version && @ie_version >= 8 # puts "IE8" file_field(:name, file_field).set(normalized_file_path) # choose_file_dialog(normalized_file_path) else file_field(:name, file_field).set(normalized_file_path) end else # for firefox, just call file_field, it may fail file_field(:name, file_field).set(normalized_file_path) end =end elem = find_element(:name, file_field_name) elem.send_keys(file_path) end |
#span_with_id(span_id, options = {}) ⇒ Object
return the text of specific (identified by attribute “id”) span tag For page containing
<span id="preferred_recorder">iTest2/Watir Recorder</span>
span_with_id(“preferred_recorder”) # => iTest2/Watir Recorder
542 543 544 545 546 547 548 549 |
# File 'lib/rwebspec-webdriver/driver.rb', line 542 def span_with_id(span_id, = {}) if && [:index] then elements = find_elements(:id, span_id.to_s) elements[[:index].to_i - 1].text else find_element(:id, span_id.to_s).text end end |
#substitute_relative_path_in_src_line(line, script_src, host_url, page_parent_url) ⇒ Object
substut
492 493 494 495 496 497 498 499 500 501 |
# File 'lib/rwebspec-webdriver/driver.rb', line 492 def substitute_relative_path_in_src_line(line, script_src, host_url, page_parent_url) unless script_src =~ /^["']?http:/ host_url.slice!(-1) if ends_with?(host_url, "/") if script_src =~ /^\s*\// # absolute_path line.gsub!(script_src, "#{host_url}#{script_src}") else #relative_path line.gsub!(script_src, "#{page_parent_url}#{script_src}") end end end |
#support_utf8 ⇒ Object Also known as: support_unicode
Support browser (IE) operations using unicode
Example:
click_button("Google 搜索")
Reference: jira.openqa.org/browse/WTR-219
582 583 584 585 586 587 |
# File 'lib/rwebspec-webdriver/driver.rb', line 582 def support_utf8 if is_windows? require 'win32ole' WIN32OLE.codepage = WIN32OLE::CP_UTF8 end end |
#use_current_browser(how = :title, what = /.*/) ⇒ Object
Reuse current an opened browser window instead of opening a new one example:
use_current_browser(:title, /.*/) # use what ever browser window
use_current_browser(:title, "TestWise") # use browser window with title "TestWise"
222 223 224 |
# File 'lib/rwebspec-webdriver/driver.rb', line 222 def use_current_browser(how = :title, what = /.*/) @web_browser = $browser || WebBrowser.attach_browser(how, what) end |
#wait_for_element(element_id, timeout = $testwise_polling_timeout, interval = $testwise_polling_interval) ⇒ Object
Wait the element with given id to be present in web page
Warning: this not working in Firefox, try use wait_util or try instead
656 657 658 659 660 661 662 663 664 665 |
# File 'lib/rwebspec-webdriver/driver.rb', line 656 def wait_for_element(element_id, timeout = $testwise_polling_timeout, interval = $testwise_polling_interval) start_time = Time.now #TODO might not work with Firefox until @web_browser.element_by_id(element_id) do sleep(interval) if (Time.now - start_time) > timeout raise RuntimeError, "failed to find element: #{element_id} for max #{timeout}" end end end |
#wait_until(timeout = $testwise_polling_timeout || 30, polling_interval = $testwise_polling_interval || 1, &block) ⇒ Object
Execute the provided block until either (1) it returns true, or (2) the timeout (in seconds) has been reached. If the timeout is reached, a TimeOutException will be raised. The block will always execute at least once.
This does not handle error, if the given block raise error, the statement finish with error Examples:
wait_until {puts 'hello'}
wait_until { div(:id, :receipt_date).exists? }
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 |
# File 'lib/rwebspec-webdriver/driver.rb', line 605 def wait_until(timeout = $testwise_polling_timeout || 30, polling_interval = $testwise_polling_interval || 1, & block) end_time = ::Time.now + timeout until ::Time.now > end_time result = nil begin result = yield(self) return result if result rescue => e end sleep polling_interval end raise TimeoutError, "timed out after #{timeout} seconds" end |