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
#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>
478 479 480 481 482 483 484 485 486 |
# File 'lib/rwebspec-webdriver/driver.rb', line 478 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” />
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 |
# File 'lib/rwebspec-webdriver/driver.rb', line 437 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
458 459 460 461 462 463 464 465 466 467 468 469 470 471 |
# File 'lib/rwebspec-webdriver/driver.rb', line 458 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.
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 |
# File 'lib/rwebspec-webdriver/driver.rb', line 633 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, )
205 206 207 208 209 210 211 212 213 214 |
# File 'lib/rwebspec-webdriver/driver.rb', line 205 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
826 827 828 829 830 831 832 833 834 |
# File 'lib/rwebspec-webdriver/driver.rb', line 826 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
822 823 824 |
# File 'lib/rwebspec-webdriver/driver.rb', line 822 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"
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 |
# File 'lib/rwebspec-webdriver/driver.rb', line 797 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 …”
774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 |
# File 'lib/rwebspec-webdriver/driver.rb', line 774 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")
151 152 153 154 155 |
# File 'lib/rwebspec-webdriver/driver.rb', line 151 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
91 92 93 |
# File 'lib/rwebspec-webdriver/driver.rb', line 91 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
552 553 554 555 556 557 558 559 |
# File 'lib/rwebspec-webdriver/driver.rb', line 552 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
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 |
# File 'lib/rwebspec-webdriver/driver.rb', line 752 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
746 747 748 749 750 |
# File 'lib/rwebspec-webdriver/driver.rb', line 746 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
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 |
# File 'lib/rwebspec-webdriver/driver.rb', line 706 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")
354 355 356 357 358 |
# File 'lib/rwebspec-webdriver/driver.rb', line 354 def (image_filename) perform_operation { @web_browser.(image_filename) } end |
#close_all_browsers ⇒ Object
Close all opening browser windows
125 126 127 128 |
# File 'lib/rwebspec-webdriver/driver.rb', line 125 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.
111 112 113 114 115 116 117 118 119 |
# File 'lib/rwebspec-webdriver/driver.rb', line 111 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"
344 345 346 |
# File 'lib/rwebspec-webdriver/driver.rb', line 344 def contains(str) ContainsText.new(str) end |
#contains_text(text) ⇒ Object
337 338 339 |
# File 'lib/rwebspec-webdriver/driver.rb', line 337 def contains_text(text) @web_browser.contains_text(text) end |
#context ⇒ Object
143 144 145 |
# File 'lib/rwebspec-webdriver/driver.rb', line 143 def context @web_browser.context end |
#default_dump_dir ⇒ Object
385 386 387 388 389 390 391 392 393 394 395 396 397 |
# File 'lib/rwebspec-webdriver/driver.rb', line 385 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
381 382 383 |
# File 'lib/rwebspec-webdriver/driver.rb', line 381 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
374 375 376 |
# File 'lib/rwebspec-webdriver/driver.rb', line 374 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.
368 369 370 |
# File 'lib/rwebspec-webdriver/driver.rb', line 368 def element_text(elem_id) @web_browser.element_value(elem_id) end |
#ends_with?(str, suffix) ⇒ Boolean
500 501 502 503 |
# File 'lib/rwebspec-webdriver/driver.rb', line 500 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
312 313 314 315 316 317 318 319 320 321 322 |
# File 'lib/rwebspec-webdriver/driver.rb', line 312 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
135 136 137 138 139 140 141 |
# File 'lib/rwebspec-webdriver/driver.rb', line 135 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
100 101 102 |
# File 'lib/rwebspec-webdriver/driver.rb', line 100 def find_element(how, what) @web_browser.find_element(how, what) end |
#find_elements(how, what) ⇒ Object
104 105 106 |
# File 'lib/rwebspec-webdriver/driver.rb', line 104 def find_elements(how, what) @web_browser.find_elements(how, what) end |
#firefox ⇒ Object
Return the FireWatir::Firefox instance
165 166 167 |
# File 'lib/rwebspec-webdriver/driver.rb', line 165 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
186 187 188 189 190 |
# File 'lib/rwebspec-webdriver/driver.rb', line 186 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")
197 198 199 200 |
# File 'lib/rwebspec-webdriver/driver.rb', line 197 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
159 160 161 |
# File 'lib/rwebspec-webdriver/driver.rb', line 159 def ie @web_browser.ie end |
#is_firefox? ⇒ Boolean
169 170 171 |
# File 'lib/rwebspec-webdriver/driver.rb', line 169 def is_firefox? @web_browser.is_firefox? if @web_browser end |
#is_htmlunit? ⇒ Boolean
177 178 179 |
# File 'lib/rwebspec-webdriver/driver.rb', line 177 def is_htmlunit? RUBY_PLATFORM =~ /java/ && @web_browser end |
#is_ie? ⇒ Boolean
173 174 175 |
# File 'lib/rwebspec-webdriver/driver.rb', line 173 def is_ie? @web_browser.is_ie? if @web_browser end |
#is_linux? ⇒ Boolean
571 572 573 |
# File 'lib/rwebspec-webdriver/driver.rb', line 571 def is_linux? RUBY_PLATFORM.downcase.include?("linux") end |
#is_mac? ⇒ Boolean
563 564 565 |
# File 'lib/rwebspec-webdriver/driver.rb', line 563 def is_mac? RUBY_PLATFORM.downcase.include?("darwin") end |
#is_windows? ⇒ Boolean
567 568 569 |
# File 'lib/rwebspec-webdriver/driver.rb', line 567 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
525 526 527 528 529 530 531 532 533 |
# File 'lib/rwebspec-webdriver/driver.rb', line 525 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
362 363 364 |
# File 'lib/rwebspec-webdriver/driver.rb', line 362 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 |
# 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 return @web_browser end |
#page_source ⇒ Object
current page source (in HTML)
511 512 513 |
# File 'lib/rwebspec-webdriver/driver.rb', line 511 def page_source @web_browser.page_source end |
#page_text ⇒ Object
return plain text view of page
516 517 518 |
# File 'lib/rwebspec-webdriver/driver.rb', line 516 def page_text @web_browser.text end |
#page_title ⇒ Object
current web page title
506 507 508 |
# File 'lib/rwebspec-webdriver/driver.rb', line 506 def page_title @web_browser.page_title end |
#perform_operation(&block) ⇒ Object
324 325 326 327 328 329 330 331 332 333 334 335 |
# File 'lib/rwebspec-webdriver/driver.rb', line 324 def perform_operation(& block) begin dump_caller_stack operation_delay yield rescue RuntimeError => re puts "[DEBUG] operation error: #{re}" raise re # ensure # puts "[DEBUG] ensure #{perform_ok}" unless perform_ok end end |
#quit ⇒ Object
96 97 98 |
# File 'lib/rwebspec-webdriver/driver.rb', line 96 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)
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 |
# File 'lib/rwebspec-webdriver/driver.rb', line 402 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
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 |
# File 'lib/rwebspec-webdriver/driver.rb', line 726 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
539 540 541 542 543 544 545 546 |
# File 'lib/rwebspec-webdriver/driver.rb', line 539 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
489 490 491 492 493 494 495 496 497 498 |
# File 'lib/rwebspec-webdriver/driver.rb', line 489 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
579 580 581 582 583 584 |
# File 'lib/rwebspec-webdriver/driver.rb', line 579 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"
220 221 222 |
# File 'lib/rwebspec-webdriver/driver.rb', line 220 def use_current_browser(how = :title, what = /.*/) @web_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
653 654 655 656 657 658 659 660 661 662 |
# File 'lib/rwebspec-webdriver/driver.rb', line 653 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? }
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 |
# File 'lib/rwebspec-webdriver/driver.rb', line 602 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 |