Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 2
PORT 2
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 2

File Content

require 'active_support/time'
require 'rubygems'
require "json"
require 'selenium-webdriver'

module DriverUtility
FIREFOX_PROFILE_PATH = File.expand_path('.') + "/acceptance_test/selenium-ruby/firefoxProfile"

DBPASSWORD = "A
I "
USER = "root"
SCHEMA = "HADB"
AUTHSCHEMA = "AUTHDB"
MOCKSCHEMA = "MOCKDB"
PORT = '
PORT '


def initializeConfigurations(base_url)
# profile = Selenium::WebDriver::Firefox::Profile.new(FIREFOX_PROFILE_PATH)
@driver = Selenium::WebDriver.for :firefox
# , :profile => profile

# Selenium::WebDriver::Chrome.driver_path='/Users/omar.khaliq/Desktop/my_va_health_project/my-va-health-web/acceptance_test/selenium-ruby/crossbrowsertesting/chromedriver2'
# @driver = Selenium::WebDriver.for :chrome
# @driver = Selenium::WebDriver.for :safari
@driver.manage.window.maximize
@driver.manage.delete_all_cookies

#Selenium IDE put in a slash at end of base_url which caused bad url's below
@driver.get(base_url + "/")

@accept_next_alert = true
@verification_errors = []
sleep(1)
if BASE_URL == $DEMO
# For Demo below
@driver.find_elements(:css, '.item.app.isotope-item.ui-link:nth-of-type(21)').last
sleep(1)
click('css', '.item.app.isotope-item.ui-link:nth-of-type(11)')
end
#waitForPageToFinishLoading
sleep (1)
end

def quitDriver()
@driver.quit
# puts "driver.quit is called"
# expect(@verification_errors).to eq([])
end

def switch_to_alert_accept
@driver.switch_to.alert.accept
end

def getMainHeader()
return getTextForElement(:css, ".main-title[aria-hidden]")
end

def getPrimaryHeader()
return getTextForElement(:css, "div.primary-header h2")
end

def getSecondaryHeader()
return getTextForElement(:css, "div.secondary-header h2")
end

def getMBBHeader()
return getTextForElement(:css, "div>section>h2")
end

def gotoHome(baseUrl)
@driver.get(baseUrl + "/")
end

def gotoLaunchpad()
@driver.get("http://
IP /launchpad")
end

def getRequiredFieldInfoText()
return getTextForElement(:css, "span[required-field]")
end

def switchWindowToWindowHandleLast()
@driver.switch_to.window @driver.window_handles.last
end

def switchWindowToWindowHandleFirst()
@driver.switch_to.window @driver.window_handles.first
end

def getTotalWindowsOpen()
return @driver.window_handles.length
end

def getActiveElement()
return @driver.switch_to.active_element()
end

def getFocusedElementText()
element = getActiveElement()
return element.text
end

def getFocusedElementName()
element = getActiveElement()
return element.attribute("name")
end

def getWindowSize()
return @driver.manage.window.size
end

def resizeWindowTo(width, height)
@driver.manage.window.resize_to(width, height)
sleep 0.5
end

def resizeWindowToPhone()
resizeWindowTo(320, 480)
end

def resizeWindowToDefault()
resizeWindowTo(1260, 727)
sleep 0.5
end

def maximizeWindow
@driver.manage.window.maximize
end

def closeBrowser()
@driver.close()
end

def getCurrentURL()
return @driver.current_url
end

def getPageTitle()
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {@driver.title}
return @driver.title
end

def deleteAllCookies()
@driver.manage.delete_all_cookies
end

def getSelectedOptionValue(how, what)
select = Selenium::WebDriver::Support::Select.new(@driver.find_element(how, what))
option = select.first_selected_option
return option.attribute('value')
end


def getTextForElementId(pId)
element = @driver.find_element(:id, pId)
#puts "Element Text is : " + element.text
return element.text.strip
end

def getTextForElement(how, what)
begin
element = getElement(how, what)
return element.text.strip
rescue Exception => e
puts e
return ""
end


# element = nil
# i = 0
# begin
# elements = getElements(how, what)
# return elements.length == 0 ? nil : elements[0].text.strip
# rescue Selenium::WebDriver::Error::StaleElementReferenceError => e
# i = i + 1
# retry if i < 3
# end
# # puts "Element Text is : " + element.text
end

# grabs text of descendent elements too (strips html tags)
def getTextContentForElement(how, what)
element = @driver.find_element(how, what)
return element.attribute('textContent').strip
end

def getTextFromInput(how, what)
element = @driver.find_element(how, what)
#puts "Element Text is : " + element.text
return element.attribute("value")
end

def getTextsForElements(how, what)
elements = @driver.find_elements(how, what)
texts = []
for item in elements
texts << item.text.strip
end

return texts
end

# def click(how, what)
# #how (:class, :class_name, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath)
# #what (String)
# @driver.find_element(how, what).click
# end

def clickJquery(what)
puts "first what: "
puts what
methodname = what[/'(.*)'/, 1]
puts "first methodname: "
puts methodname
what = what.gsub("'", %q(\\\'))
puts "second what: "
puts what
@driver.execute_script("$('" + what + "').scope()." + methodname)
end

def clickJqueryEvent(what)
@driver.execute_script("$('" + what + "').click()")
end

def clickRowJquery(what)
if what == "#logout"
@driver.execute_script("$('#logout').scope().openLink($('#logout').scope().item.link)")
else
what = what.gsub("'", %q(\\\'))
puts "first what: "
puts what
@driver.execute_script("$('" + what + "').scope().onItemClick({item : $('" + what + "').scope().item })")
end
end

def clickRowJqueryGoals(what)
if what == "#logout"
@driver.execute_script("$('#logout').scope().openLink($('#logout').scope().item.link)")
else
what = what.gsub("'", %q(\\\'))
puts "first what: "
puts what
@driver.execute_script("$('" + what + "').scope().getDetails($('" + what + "').scope().goal)")
end
end

def click(how, what)
#how (:class, :class_name, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath)
#what (String)
@driver.find_element(how, what).click
end

def clickIndex(how,what,index)
element = @driver.find_elements(how, what)
element[index].click
end

def verifyText(how, what, text)
text = text.strip
@driver.find_element(how, what).text.include?(text).should == true

end

def getElement(how, what)
element = @driver.find_element(how, what)
return element
end

def getElements(how, what)
#how (:class, :class_name, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath)
#what (String)
elements = []
elements = @driver.find_elements(how, what)
return elements
end

def isElementVisible(pId)
begin
element = @driver.find_element(:id, pId)
return element.displayed?
rescue Exception=>e
return false
end
end

def isElementDisappeared(how, what)
return @driver.find_elements(how, what).size == 0
end

def isElementVisible(how, what)
begin
element = @driver.find_element(how, what)
#puts "DEBUG DriverUtility.isElementVisible: element found [#{what}]"
#puts "DEBUG DriverUtility.isElementVisible: is displayed? [#{element.displayed?}]"
return element.displayed?
rescue Exception=>e
#puts "DEBUG DriverUtility.isElementVisible: element not found [#{what}]"
return false
end
end

def isElementEnabled?(how, what)
element = @driver.find_element(how, what)
#puts 'isElementEnabled? ' + element.enabled?.to_s
return element.enabled?
end

def isElementPresentAndVisible(how, what)
isDisplayed = false
begin
element = getElement(how, what)
if(element.displayed?)
isDisplayed = true
end
rescue Exception => e
return false
end

return isDisplayed
end

def isThisElementDisabled(selectorName, selectorPath)
#selectorName: :id, :css, :class, :name
#selectorPath: "dropdown", "select[name='dropdownform']"

isItDisabled = false
element = getElement(selectorName, selectorPath)
if element.attribute("disabled") != nil then
isItDisabled = true
end

return isItDisabled
end

def is_element_present(how, what)
begin
@driver.find_element(how, what)
return true
rescue Exception=>e
return false
end
end

def isFieldRequired(how, what)
element = getElement(how, what)
required = element.attribute("required")
if required == "true"
return true
else
return false
end
end

def executeJquery(jqueryStr)
@driver.execute_script(jQuery(jqueryStr))
end

def executeJavaScript(javaScriptStr)
@driver.execute_script(javaScriptStr)
end

#format="%b %d, %Y" JAN 10, 2014
#format="%m/%d/%Y" 01/10/2014
def isDateFormatValid?(dateStr, formatStr)
#puts "Date String is " + dateStr
begin
dateObj = DateTime.strptime(dateStr, format=formatStr)
#puts "[isDateFormatValid?] Date is " + dateObj.to_s

return true
rescue Exception=>e
return false
end
end

def isTimeFormatValid?(timeStr, formatStr)
#puts "Date String is " + dateStr
begin
time = DateTime.strptime(timeStr, format=formatStr)
#puts "[isDateFormatValid?] Date is " + dateObj.to_s

return true
rescue Exception=>e
return false
end
end

#format=%Y-%m-%d"
def getDateNthDaysAgo(numberOfDaysAgo, formatStr)
dateNthDaysAgo = numberOfDaysAgo.day.ago.strftime(format=formatStr)

return dateNthDaysAgo

end

def getDateNthDaysFromNow(numberOfDaysFromNow, formatStr)
dateNthDaysFromNow = numberOfDaysFromNow.day.from_now.strftime(format=formatStr)

return dateNthDaysFromNow
end

def getDateNthMonthsFromNow(numberOfDaysFromNow, formatStr)
dateNthDaysFromNow = numberOfDaysFromNow.month.from_now.strftime(format=formatStr)

return dateNthDaysFromNow
end

def getDateNthDaysFromGivenDate(dateStr, nthDay)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
nthDaysLater = time + nthDay.day

return nthDaysLater.strftime("%m/%d/%Y")
end

#input date string format is "%m/%d/%Y"
def convertDateByFormatStr(dateStr, format)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
return time.strftime(format)
end

def getDateNThYearFromGivenDate(dateStr, nthYear)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
nthYearLater = time + nthYear.year

return nthYearLater.strftime("%m/%d/%Y")
end

def getDateNthYeasFromNow(numberOfYearsFromNow, formatStr)
dateStr = numberOfYearsFromNow.year.from_now.strftime(format=formatStr)

#puts ("[getDateNthYearsFromNow() ]" + dateStr)

return dateStr
end

def getDateNthYearsAgo(numberOfYearsAgo, formatStr)
dateNthYearsAgo = numberOfYearsAgo.year.ago.strftime(format=formatStr)

return dateNthYearsAgo
end

def getDayofWeek(dateStr)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
puts "time=" + time.to_s
time.strftime("%A")
end

def clickBackButtonOnBrowser()
@driver.goBack()
end

def clickBackButtonOnBrowser()
@driver.navigate.back()
end

def refreshBrowser()
@driver.navigate().refresh()
end

def moveArrowInputRangeToRight(inputName, numberOfArrowMove)
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :tab
sleep 1
for i in 1..numberOfArrowMove
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :arrow_right
sleep 1
end
end

def moveArrowInputRangeToLeft(inputName, numberOfArrowMove)
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :tab
sleep 1
for i in 1..numberOfArrowMove
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :arrow_left
sleep 1
end
end

def getInputRangeValue(inputName)
element = @driver.find_element(:css, "input[name=" + inputName + "]")
return element.attribute("aria-valuetext").strip
end

def setDateAndTime(dateStr, timeStr, dateCssPath, timeCssPath)
sleep 1
setDate(dateStr, dateCssPath)
sleep 0.5
setTime(timeStr, timeCssPath)
sleep 0.5
end

def setDate(dateStr, cssPath)
#cssPath could be e.g. "input[name='date']"
sleep 1
@driver.find_element(:css, cssPath).clear
@driver.find_element(:css, cssPath).send_keys(dateStr)
sleep 2
end

def setTime(timeStr, cssPath)
##cssPath could be e.g. "input[name='time']"
time = Time.parse(timeStr);
elem = @driver.find_element(:css, cssPath)
elem.clear
sleep 1
elem.send_keys(time.strftime("%I"))
elem.send_keys [:shift, ";"]
elem.send_keys(time.strftime("%M %p"))
sleep 1

end

def clearDateOrTime(cssPath)
@driver.find_element(:css, cssPath).clear
end

def getPlaceHolder(name)
element = getElement(:name, name)
return element.attribute('placeholder')
end

def getPlaceHolderByCSS(how, where)
element = getElement(how, where)
return element.attribute('placeholder')
end

def selectTimeZone(timeZone)
#puts "Time Zone is " + timeZone
waitForPageToFinishLoading
@driver.execute_script("$('[name=timeZone]').scope().preferences.timeZone = \"" + timeZone + "\"")
@driver.execute_script("$('[name=timeZone]').scope().$digest()")
end

def byPassTheNotificationSettingsScreen()
#Select a Timezone from the drop down
selectTimeZone("(-05:00) America/New_York (Eastern)")
waitForPageToFinishLoading
@driver.execute_script("$('button[ng-click=\"save()\"]').scope().save()")
end

def setNarrative(text)
@driver.find_element(:css, "textarea[name='Note']").clear
sleep 1
@driver.find_element(:css, "textarea[name='Note']").send_keys(text)
end

def verifyTotalCharacterInNarrative()
boundaryTest = false
part1 = "VerifyTheTotalAllowedCharactersInNarrativeField001"
part2 = "VerifyTheTotalAllowedCharactersInNarrativeField002"
part3 = "VerifyTheTotalAllowedCharactersInNarrativeField003"
part4 = "VerifyTheTotalAllowedCharactersInNarrativeField004"
part5 = "VerifyTheTotalAllowedCharactersInNarrativeField005"
typeInText = part1 + part2 + part3 + part4 + part5

setNarrative(typeInText)
sleep 1

counterText = getTextForElement(:css, "span[ng-if='characterCounter']")
if counterText == "0 characters left"
boundaryTest = true
else
boundaryTest = false
end

return boundaryTest
end

def isThisRadioButtonOrCheckBoxSelected(type, value, radioButtonName)
element = getElement(:css, "input[name='" + radioButtonName + "'][type='" + type + "'][value='" + value +"']")
#puts "[isThisRadioButtonOrCheckBoxSelected] Value " + value + " - " + element.selected?.to_s
return element.selected?
end

def areAllTheseValuesAvailableInDropDown(cssPath, valueString)
verifiedTrue = true
select = getElement(:css, cssPath)
options = select.find_elements(:tag_name, "option")
options.each do |option|
displayedValue = option.attribute('value')
if displayedValue == nil then
displayedValue = "Select"
end

if valueString.include?(displayedValue) == false then
verifiedTrue = false
break
end
end

return verifiedTrue
end

##SHEERI DID IT!!!

def numeric?(string)
Float(string) != nil rescue false
end

def getFieldType(fieldName)
field = getField(fieldName)
type = field.tag_name

if(type == "input")
type = field.attribute("type")
end

return type
end

def getField(fieldName)
return getElement(:css, "input[name='" + fieldName + "'], textarea[name='" + fieldName + "'], select[name='" + fieldName + "']")
end

def clearField(fieldName)
case getFieldType(fieldName)
when "checkbox", "radio"
puts "TODO"
when "select"
setSelectField(fieldName, "")
else
getField(fieldName).clear
end

sleep 0.5
end

def editField(fieldName, value)
case getFieldType(fieldName)
when "radio", "checkbox"
puts "TODO"
when "file"
addAttachment(fieldName, value)
when "select"
setSelectField(fieldName, value)
when "range"
setSliderField(fieldName, value)
else
setKeyboardField(fieldName, value)
end
sleep 0.5
end

def getLongFieldLabel(fieldName)
return getTextForElement(:css, "[name='" + fieldName + "'] .input-label-content")
end

def getShortFieldLabel(fieldName, isRequired)
return getTextForElement(:css, "[name='" + fieldName + "'] .input-label-content span:nth-of-type(" + (isRequired ? 2 : 1).to_s + ")")
end

def getShortFieldLabelScreenReader(fieldName, isRequired)
return getTextForElement(:css, "[name='" + fieldName + "'] .input-label-content span:nth-of-type(" + (isRequired ? 3 : 2).to_s + ")")
end

def getValueInField(fieldName)
return getField(fieldName).attribute("value")
end

def setEntryValues(entryMap)
entryMap.each { | key, value |
editField(key, value)
}
end

def setKeyboardField(fieldName, value)
field = getField(fieldName)
field.clear
field.send_keys(value.to_s)
sleep 0.5
end

def setSelectField(fieldName, value)
waitForPageToFinishLoading
field = getField(fieldName)
if field != nil
select = Selenium::WebDriver::Support::Select.new(field)
@driver.execute_script("$('.container-fluid').css('overflow', 'auto');")
select.select_by(:text, value)
end
@driver.execute_script("$('.container-fluid').css('overflow', 'visible');")
maximizeWindow
end

def setSliderField(fieldName, value)
field = getField(fieldName)
field.send_keys :tab

currentValue = field.attribute("value").to_f
step = field.attribute("step").to_f

numSteps = ((value - currentValue)/step).to_i

# sleep 0.2

direction = numSteps > 0 ? :arrow_right : :arrow_left

numSteps = numSteps.abs

for i in 1..numSteps
field.send_keys direction
sleep 0.2
end

end

def addAttachment(fieldName, value)
inputFile = getField(fieldName)
inputFile.send_keys (File.dirname(__FILE__) + "/../resources/" + value)
end

def deleteAttachment(attachementNumber)
attachmentDeleteButtons = getElements(:css, "[ng-click='deleteAttachment($index)']")
attachmentDeleteButtons[attachementNumber - 1].click
end

def waitForPageToFinishLoading
sleep 2
!45.times{ break if (isElementVisible(:css, ".content-loaded") == true); sleep 0.5 }
sleep 2
end

def waitforCssAttributeToLoad(cssAttribute)
sleep 1
!45.times{ break if (isElementVisible(:css, cssAttribute) == true); sleep 0.5 }
end

def stripSelectTextFromScreen(mainList, selectFields)
tmpList = mainList
selectFields.each do | f |
tmpList = removeSubsetFromList( tmpList, getPulldownValues(f))
end
return tmpList
end

def getPulldownValues(fieldName)
#puts "Type is [#{type}]"
select = getElement(:css, "select[name='"+ fieldName + "']")
options = select.find_elements(:tag_name, "option")
values = []
options.each_with_index do |e, i|
#puts "Checking option <#{e.text}>"
values << e.text
end
#puts "getPulldownValues=[#{values}]"
return values
end


def removeSubsetFromList(mainList, subsetList)
if subsetList.length == 0
return mainList
end
startPos = mainList.index(subsetList[1])
#puts "removeSubsetFromList startPos=[#{startPos}] [#{subsetList[1]}]"
retArray = []
if startPos == nil
retArray = mainList
else
retArray = mainList[0..startPos-2]
# retArray.each_with_index do | ee, j|
# puts "retArray(1)=[#{j}] [#{ee}]"
#end
endPos = 0
pos = startPos
subsetList.each_with_index do |e, i|
if i > 0
#puts "comparing [#{i}] [#{e}] with [#{mainList[startPos]}] startPos=[#{startPos}] endPos=[#{endPos}] pos=[#{pos}]"
if e != mainList[pos]
#puts "endPos = #{endPos}"
break
end
pos = pos + 1
endPos = endPos + 1
end
end
endPos = endPos + startPos
#puts "endPos=[#{endPos}] after loop"
for i in endPos..(mainList.length-1)
retArray << mainList[i]
end
#retArray.each_with_index do | ee, j|
# puts "retArray(2)=[#{j}] [#{ee}]"
#end
end

return retArray

end

def setPhoneInput(selector, text)
elem = @driver.find_element(:css, selector)
elem.click
elem.clear
elem.send_keys "\u0008"
text.split("").each do |i|
elem.send_keys i
end
end

def getSelectBoxText(selector)
select = Selenium::WebDriver::Support::Select.new(@driver.find_element(:css, selector))
return select.first_selected_option.text()
end

def setInput(selector, text)
waitForPageToFinishLoading
@driver.find_element(:css, selector).clear;
@driver.find_element(:css, selector).send_keys(text);
end

def setSelectBoxValue(selector, value)
waitForPageToFinishLoading
field = getElement(:css, selector)
if field != nil
select = Selenium::WebDriver::Support::Select.new(field)
@driver.execute_script("$('.container-fluid').css('overflow', 'auto');")
select.select_by(:text, value)
@driver.execute_script("$('.container-fluid').css('overflow', 'visible');")
maximizeWindow
end
end

def setEmptyCountryBoxValue(selector, value)
selector = selector.gsub("'", %q(\\\'))
@driver.execute_script("$('" + selector + "').scope().details.address = {}")
@driver.execute_script("$('" + selector + "').scope().details.address.country = '" + value + "'")
@driver.execute_script("$('" + selector + "').scope().$digest()")
end

def formatTimeAMPM(t)
return t.strftime("%I:%M %P").upcase.gsub(/ /," ")
end

def formatFullDateTime(t)
# dt = DateTime.parse(t.to_s())
## The DateTime function was failing occasionally. There is a known bug with the rounding in new_offset.
## The below fix will only work if the tests are run in time zone EST
t = Time.parse(t.to_s()).in_time_zone("Eastern Time (US & Canada)")
# return dt.new_offset(DateTime.now.offset).strftime('%m/%d/%Y %I:%M %p')
return t.strftime("%m/%d/%Y %I:%M %p")
end

def getTodayInZeroTimeUTC
# Get current time into array
# format is [sec,min,hour,day,month,year,wday,yday,isdst,zone]
a = Time.now.utc.to_a
# Zero out sec, min, hrs positions
a[0] = 0
a[1] = 0
a[2] = 0
# Convert it to date
return Time.utc(*a)
end

def getTodayInZeroTime
# Get current time into array
# format is [sec,min,hour,day,month,year,wday,yday,isdst,zone]
a = Time.now.to_a
# Zero out sec, min, hrs positions
a[0] = 0
a[1] = 0
a[2] = 0
# Convert it to date
return Time.local(*a)
end


def addDays(t, d)
# Convert days into seconds and add it to date
return t+(d*86400)
end


def getElementColor(selector, cssvalue)
rgb = getElement(:css, selector).css_value(cssvalue).gsub(/rgba\(/,"").gsub(/\)/,"").split(",")
color = '#%02x%02x%02x' % [rgb[0], rgb[1], rgb[2]]
return color.upcase
end

def getElementAttribute(csspath, attributeKey)
element = @driver.find_element(:css, csspath)
return element.attribute(attributeKey)

end

def dropdownOption(tagname, css, text)
dropdown_list = @driver.find_element(:css, css)
options = dropdown_list.find_elements(:tag_name, tagname)
options.each { |option| option.click if option.text == text }
selected_option = options.map { |option| option.text if option.selected? }.join
expect(selected_option.text).to eql text
end

end






















































############################################################################ ORIGINAL CODE ################################################################
###########################################################################################################################################################

=begin

require 'active_support/time'
require 'rubygems'
require "json"
require 'selenium-webdriver'

module DriverUtility
FIREFOX_PROFILE_PATH = File.expand_path('.') + "/acceptance_test/selenium-ruby/firefoxProfile"

DBPASSWORD = "A
I "
USER = "root"
SCHEMA = "HADB"
AUTHSCHEMA = "AUTHDB"
MOCKSCHEMA = "MOCKDB"
PORT = '
PORT '


def initializeConfigurations(base_url)
# profile = Selenium::WebDriver::Firefox::Profile.new(FIREFOX_PROFILE_PATH)
@driver = Selenium::WebDriver.for :firefox
# , :profile => profile

# Selenium::WebDriver::Chrome.driver_path='/Users/omar.khaliq/Desktop/my_va_health_project/my-va-health-web/acceptance_test/selenium-ruby/crossbrowsertesting/chromedriver2'
# @driver = Selenium::WebDriver.for :chrome
# @driver = Selenium::WebDriver.for :safari
@driver.manage.window.maximize
@driver.manage.delete_all_cookies

#Selenium IDE put in a slash at end of base_url which caused bad url's below
@driver.get(base_url + "/")

@accept_next_alert = true
@verification_errors = []
sleep(1)
if BASE_URL == $DEMO
# For Demo below
@driver.find_elements(:css, '.item.app.isotope-item.ui-link:nth-of-type(21)').last
sleep(1)
click('css', '.item.app.isotope-item.ui-link:nth-of-type(11)')
end
#waitForPageToFinishLoading
sleep (1)
end

def quitDriver()
@driver.quit
# puts "driver.quit is called"
# expect(@verification_errors).to eq([])
end

def switch_to_alert_accept
@driver.switch_to.alert.accept
end

def getMainHeader()
return getTextForElement(:css, ".main-title[aria-hidden]")
end

def getPrimaryHeader()
return getTextForElement(:css, "div.primary-header h2")
end

def getSecondaryHeader()
return getTextForElement(:css, "div.secondary-header h2")
end

def getMBBHeader()
return getTextForElement(:css, "div>section>h2")
end

def gotoHome(baseUrl)
@driver.get(baseUrl + "/")
end

def gotoLaunchpad()
@driver.get("http://
IP /launchpad")
end

def getRequiredFieldInfoText()
return getTextForElement(:css, "span[required-field]")
end

def switchWindowToWindowHandleLast()
@driver.switch_to.window @driver.window_handles.last
end

def switchWindowToWindowHandleFirst()
@driver.switch_to.window @driver.window_handles.first
end

def getTotalWindowsOpen()
return @driver.window_handles.length
end

def getActiveElement()
return @driver.switch_to.active_element()
end

def getFocusedElementText()
element = getActiveElement()
return element.text
end

def getFocusedElementName()
element = getActiveElement()
return element.attribute("name")
end

def getWindowSize()
return @driver.manage.window.size
end

def resizeWindowTo(width, height)
@driver.manage.window.resize_to(width, height)
sleep 0.5
end

def resizeWindowToPhone()
resizeWindowTo(320, 480)
end

def resizeWindowToDefault()
resizeWindowTo(1260, 727)
sleep 0.5
end

def maximizeWindow
@driver.manage.window.maximize
end

def closeBrowser()
@driver.close()
end

def getCurrentURL()
return @driver.current_url
end

def getPageTitle()
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {@driver.title}
return @driver.title
end

def deleteAllCookies()
@driver.manage.delete_all_cookies
end

def getSelectedOptionValue(how, what)
select = Selenium::WebDriver::Support::Select.new(@driver.find_element(how, what))
option = select.first_selected_option
return option.attribute('value')
end


def getTextForElementId(pId)
element = @driver.find_element(:id, pId)
#puts "Element Text is : " + element.text
return element.text.strip
end

def getTextForElement(how, what)
begin
element = getElement(how, what)
return element.text.strip
rescue Exception => e
puts e
return ""
end


# element = nil
# i = 0
# begin
# elements = getElements(how, what)
# return elements.length == 0 ? nil : elements[0].text.strip
# rescue Selenium::WebDriver::Error::StaleElementReferenceError => e
# i = i + 1
# retry if i < 3
# end
# # puts "Element Text is : " + element.text
end

# grabs text of descendent elements too (strips html tags)
def getTextContentForElement(how, what)
element = @driver.find_element(how, what)
return element.attribute('textContent').strip
end

def getTextFromInput(how, what)
element = @driver.find_element(how, what)
#puts "Element Text is : " + element.text
return element.attribute("value")
end

def getTextsForElements(how, what)
elements = @driver.find_elements(how, what)
texts = []
for item in elements
texts << item.text.strip
end

return texts
end

# def click(how, what)
# #how (:class, :class_name, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath)
# #what (String)
# @driver.find_element(how, what).click
# end

def clickJquery(what)
puts "first what: "
puts what
methodname = what[/'(.*)'/, 1]
puts "first methodname: "
puts methodname
what = what.gsub("'", %q(\\\'))
puts "second what: "
puts what
@driver.execute_script("$('" + what + "').scope()." + methodname)
end

def clickJqueryEvent(what)
@driver.execute_script("$('" + what + "').click()")
end

def clickRowJquery(what)
if what == "#logout"
@driver.execute_script("$('#logout').scope().openLink($('#logout').scope().item.link)")
else
what = what.gsub("'", %q(\\\'))
puts "first what: "
puts what
@driver.execute_script("$('" + what + "').scope().onItemClick({item : $('" + what + "').scope().item })")
end
end

def clickRowJqueryGoals(what)
if what == "#logout"
@driver.execute_script("$('#logout').scope().openLink($('#logout').scope().item.link)")
else
what = what.gsub("'", %q(\\\'))
puts "first what: "
puts what
@driver.execute_script("$('" + what + "').scope().getDetails($('" + what + "').scope().goal)")
end
end

def click(how, what)
#how (:class, :class_name, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath)
#what (String)
@driver.find_element(how, what).click
end

def clickIndex(how,what,index)
element = @driver.find_elements(how, what)
element[index].click
end

def verifyText(how, what, text)
text = text.strip
@driver.find_element(how, what).text.include?(text).should == true

end

def getElement(how, what)
element = @driver.find_element(how, what)
return element
end

def getElements(how, what)
#how (:class, :class_name, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath)
#what (String)
elements = []
elements = @driver.find_elements(how, what)
return elements
end

def isElementVisible(pId)
begin
element = @driver.find_element(:id, pId)
return element.displayed?
rescue Exception=>e
return false
end
end

def isElementDisappeared(how, what)
return @driver.find_elements(how, what).size == 0
end

def isElementVisible(how, what)
begin
element = @driver.find_element(how, what)
#puts "DEBUG DriverUtility.isElementVisible: element found [#{what}]"
#puts "DEBUG DriverUtility.isElementVisible: is displayed? [#{element.displayed?}]"
return element.displayed?
rescue Exception=>e
#puts "DEBUG DriverUtility.isElementVisible: element not found [#{what}]"
return false
end
end

def isElementEnabled?(how, what)
element = @driver.find_element(how, what)
#puts 'isElementEnabled? ' + element.enabled?.to_s
return element.enabled?
end

def isElementPresentAndVisible(how, what)
isDisplayed = false
begin
element = getElement(how, what)
if(element.displayed?)
isDisplayed = true
end
rescue Exception => e
return false
end

return isDisplayed
end

def isThisElementDisabled(selectorName, selectorPath)
#selectorName: :id, :css, :class, :name
#selectorPath: "dropdown", "select[name='dropdownform']"

isItDisabled = false
element = getElement(selectorName, selectorPath)
if element.attribute("disabled") != nil then
isItDisabled = true
end

return isItDisabled
end

def is_element_present(how, what)
begin
@driver.find_element(how, what)
return true
rescue Exception=>e
return false
end
end

def isFieldRequired(how, what)
element = getElement(how, what)
required = element.attribute("required")
if required == "true"
return true
else
return false
end
end

def executeJquery(jqueryStr)
@driver.execute_script(jQuery(jqueryStr))
end

def executeJavaScript(javaScriptStr)
@driver.execute_script(javaScriptStr)
end

#format="%b %d, %Y" JAN 10, 2014
#format="%m/%d/%Y" 01/10/2014
def isDateFormatValid?(dateStr, formatStr)
#puts "Date String is " + dateStr
begin
dateObj = DateTime.strptime(dateStr, format=formatStr)
#puts "[isDateFormatValid?] Date is " + dateObj.to_s

return true
rescue Exception=>e
return false
end
end

def isTimeFormatValid?(timeStr, formatStr)
#puts "Date String is " + dateStr
begin
time = DateTime.strptime(timeStr, format=formatStr)
#puts "[isDateFormatValid?] Date is " + dateObj.to_s

return true
rescue Exception=>e
return false
end
end

#format=%Y-%m-%d"
def getDateNthDaysAgo(numberOfDaysAgo, formatStr)
dateNthDaysAgo = numberOfDaysAgo.day.ago.strftime(format=formatStr)

return dateNthDaysAgo

end

def getDateNthDaysFromNow(numberOfDaysFromNow, formatStr)
dateNthDaysFromNow = numberOfDaysFromNow.day.from_now.strftime(format=formatStr)

return dateNthDaysFromNow
end

def getDateNthMonthsFromNow(numberOfDaysFromNow, formatStr)
dateNthDaysFromNow = numberOfDaysFromNow.month.from_now.strftime(format=formatStr)

return dateNthDaysFromNow
end

def getDateNthDaysFromGivenDate(dateStr, nthDay)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
nthDaysLater = time + nthDay.day

return nthDaysLater.strftime("%m/%d/%Y")
end

#input date string format is "%m/%d/%Y"
def convertDateByFormatStr(dateStr, format)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
return time.strftime(format)
end

def getDateNThYearFromGivenDate(dateStr, nthYear)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
nthYearLater = time + nthYear.year

return nthYearLater.strftime("%m/%d/%Y")
end

def getDateNthYeasFromNow(numberOfYearsFromNow, formatStr)
dateStr = numberOfYearsFromNow.year.from_now.strftime(format=formatStr)

#puts ("[getDateNthYearsFromNow() ]" + dateStr)

return dateStr
end

def getDateNthYearsAgo(numberOfYearsAgo, formatStr)
dateNthYearsAgo = numberOfYearsAgo.year.ago.strftime(format=formatStr)

return dateNthYearsAgo
end

def getDayofWeek(dateStr)
dateStrArray = dateStr.split("/")
time = Time.parse(dateStrArray[2] + '-' + dateStrArray[0] + '-' + dateStrArray[1] + ' 09:00 AM')
puts "time=" + time.to_s
time.strftime("%A")
end

def clickBackButtonOnBrowser()
@driver.goBack()
end

def clickBackButtonOnBrowser()
@driver.navigate.back()
end

def refreshBrowser()
@driver.navigate().refresh()
end

def moveArrowInputRangeToRight(inputName, numberOfArrowMove)
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :tab
sleep 1
for i in 1..numberOfArrowMove
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :arrow_right
sleep 1
end
end

def moveArrowInputRangeToLeft(inputName, numberOfArrowMove)
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :tab
sleep 1
for i in 1..numberOfArrowMove
@driver.find_element(:css, "input[name=" + inputName + "]").send_keys :arrow_left
sleep 1
end
end

def getInputRangeValue(inputName)
element = @driver.find_element(:css, "input[name=" + inputName + "]")
return element.attribute("aria-valuetext").strip
end

def setDateAndTime(dateStr, timeStr, dateCssPath, timeCssPath)
sleep 1
setDate(dateStr, dateCssPath)
sleep 0.5
setTime(timeStr, timeCssPath)
sleep 0.5
end

def setDate(dateStr, cssPath)
#cssPath could be e.g. "input[name='date']"
sleep 1
@driver.find_element(:css, cssPath).clear
@driver.find_element(:css, cssPath).send_keys(dateStr)
sleep 2
end

def setTime(timeStr, cssPath)
##cssPath could be e.g. "input[name='time']"
time = Time.parse(timeStr);
elem = @driver.find_element(:css, cssPath)
elem.clear
sleep 1
elem.send_keys(time.strftime("%I"))
elem.send_keys [:shift, ";"]
elem.send_keys(time.strftime("%M %p"))
sleep 1

end

def clearDateOrTime(cssPath)
@driver.find_element(:css, cssPath).clear
end

def getPlaceHolder(name)
element = getElement(:name, name)
return element.attribute('placeholder')
end

def getPlaceHolderByCSS(how, where)
element = getElement(how, where)
return element.attribute('placeholder')
end

def selectTimeZone(timeZone)
#puts "Time Zone is " + timeZone
waitForPageToFinishLoading
@driver.execute_script("$('[name=timeZone]').scope().preferences.timeZone = \"" + timeZone + "\"")
@driver.execute_script("$('[name=timeZone]').scope().$digest()")
end

def byPassTheNotificationSettingsScreen()
#Select a Timezone from the drop down
selectTimeZone("(-05:00) America/New_York (Eastern)")
waitForPageToFinishLoading
@driver.execute_script("$('button[ng-click=\"save()\"]').scope().save()")
end

def setNarrative(text)
@driver.find_element(:css, "textarea[name='Note']").clear
sleep 1
@driver.find_element(:css, "textarea[name='Note']").send_keys(text)
end

def verifyTotalCharacterInNarrative()
boundaryTest = false
part1 = "VerifyTheTotalAllowedCharactersInNarrativeField001"
part2 = "VerifyTheTotalAllowedCharactersInNarrativeField002"
part3 = "VerifyTheTotalAllowedCharactersInNarrativeField003"
part4 = "VerifyTheTotalAllowedCharactersInNarrativeField004"
part5 = "VerifyTheTotalAllowedCharactersInNarrativeField005"
typeInText = part1 + part2 + part3 + part4 + part5

setNarrative(typeInText)
sleep 1

counterText = getTextForElement(:css, "span[ng-if='characterCounter']")
if counterText == "0 characters left"
boundaryTest = true
else
boundaryTest = false
end

return boundaryTest
end

def isThisRadioButtonOrCheckBoxSelected(type, value, radioButtonName)
element = getElement(:css, "input[name='" + radioButtonName + "'][type='" + type + "'][value='" + value +"']")
#puts "[isThisRadioButtonOrCheckBoxSelected] Value " + value + " - " + element.selected?.to_s
return element.selected?
end

def areAllTheseValuesAvailableInDropDown(cssPath, valueString)
verifiedTrue = true
select = getElement(:css, cssPath)
options = select.find_elements(:tag_name, "option")
options.each do |option|
displayedValue = option.attribute('value')
if displayedValue == nil then
displayedValue = "Select"
end

if valueString.include?(displayedValue) == false then
verifiedTrue = false
break
end
end

return verifiedTrue
end

##SHEERI DID IT!!!

def numeric?(string)
Float(string) != nil rescue false
end

def getFieldType(fieldName)
field = getField(fieldName)
type = field.tag_name

if(type == "input")
type = field.attribute("type")
end

return type
end

def getField(fieldName)
return getElement(:css, "input[name='" + fieldName + "'], textarea[name='" + fieldName + "'], select[name='" + fieldName + "']")
end

def clearField(fieldName)
case getFieldType(fieldName)
when "checkbox", "radio"
puts "TODO"
when "select"
setSelectField(fieldName, "")
else
getField(fieldName).clear
end

sleep 0.5
end

def editField(fieldName, value)
case getFieldType(fieldName)
when "radio", "checkbox"
puts "TODO"
when "file"
addAttachment(fieldName, value)
when "select"
setSelectField(fieldName, value)
when "range"
setSliderField(fieldName, value)
else
setKeyboardField(fieldName, value)
end
sleep 0.5
end

def getLongFieldLabel(fieldName)
return getTextForElement(:css, "[name='" + fieldName + "'] .input-label-content")
end

def getShortFieldLabel(fieldName, isRequired)
return getTextForElement(:css, "[name='" + fieldName + "'] .input-label-content span:nth-of-type(" + (isRequired ? 2 : 1).to_s + ")")
end

def getShortFieldLabelScreenReader(fieldName, isRequired)
return getTextForElement(:css, "[name='" + fieldName + "'] .input-label-content span:nth-of-type(" + (isRequired ? 3 : 2).to_s + ")")
end

def getValueInField(fieldName)
return getField(fieldName).attribute("value")
end

def setEntryValues(entryMap)
entryMap.each { | key, value |
editField(key, value)
}
end

def setKeyboardField(fieldName, value)
field = getField(fieldName)
field.clear
field.send_keys(value.to_s)
sleep 0.5
end

def setSelectField(fieldName, value)
waitForPageToFinishLoading
field = getField(fieldName)
if field != nil
select = Selenium::WebDriver::Support::Select.new(field)
@driver.execute_script("$('.container-fluid').css('overflow', 'auto');")
select.select_by(:text, value)
end
@driver.execute_script("$('.container-fluid').css('overflow', 'visible');")
maximizeWindow
end

def setSliderField(fieldName, value)
field = getField(fieldName)
field.send_keys :tab

currentValue = field.attribute("value").to_f
step = field.attribute("step").to_f

numSteps = ((value - currentValue)/step).to_i

# sleep 0.2

direction = numSteps > 0 ? :arrow_right : :arrow_left

numSteps = numSteps.abs

for i in 1..numSteps
field.send_keys direction
sleep 0.2
end

end

def addAttachment(fieldName, value)
inputFile = getField(fieldName)
inputFile.send_keys (File.dirname(__FILE__) + "/../resources/" + value)
end

def deleteAttachment(attachementNumber)
attachmentDeleteButtons = getElements(:css, "[ng-click='deleteAttachment($index)']")
attachmentDeleteButtons[attachementNumber - 1].click
end

def waitForPageToFinishLoading
sleep 2
!45.times{ break if (isElementVisible(:css, ".content-loaded") == true); sleep 0.5 }
sleep 2
end

def waitforCssAttributeToLoad(cssAttribute)
sleep 1
!45.times{ break if (isElementVisible(:css, cssAttribute) == true); sleep 0.5 }
end

def stripSelectTextFromScreen(mainList, selectFields)
tmpList = mainList
selectFields.each do | f |
tmpList = removeSubsetFromList( tmpList, getPulldownValues(f))
end
return tmpList
end

def getPulldownValues(fieldName)
#puts "Type is [#{type}]"
select = getElement(:css, "select[name='"+ fieldName + "']")
options = select.find_elements(:tag_name, "option")
values = []
options.each_with_index do |e, i|
#puts "Checking option <#{e.text}>"
values << e.text
end
#puts "getPulldownValues=[#{values}]"
return values
end


def removeSubsetFromList(mainList, subsetList)
if subsetList.length == 0
return mainList
end
startPos = mainList.index(subsetList[1])
#puts "removeSubsetFromList startPos=[#{startPos}] [#{subsetList[1]}]"
retArray = []
if startPos == nil
retArray = mainList
else
retArray = mainList[0..startPos-2]
# retArray.each_with_index do | ee, j|
# puts "retArray(1)=[#{j}] [#{ee}]"
#end
endPos = 0
pos = startPos
subsetList.each_with_index do |e, i|
if i > 0
#puts "comparing [#{i}] [#{e}] with [#{mainList[startPos]}] startPos=[#{startPos}] endPos=[#{endPos}] pos=[#{pos}]"
if e != mainList[pos]
#puts "endPos = #{endPos}"
break
end
pos = pos + 1
endPos = endPos + 1
end
end
endPos = endPos + startPos
#puts "endPos=[#{endPos}] after loop"
for i in endPos..(mainList.length-1)
retArray << mainList[i]
end
#retArray.each_with_index do | ee, j|
# puts "retArray(2)=[#{j}] [#{ee}]"
#end
end

return retArray

end

def setPhoneInput(selector, text)
elem = @driver.find_element(:css, selector)
elem.click
elem.clear
elem.send_keys "\u0008"
text.split("").each do |i|
elem.send_keys i
end
end

def getSelectBoxText(selector)
select = Selenium::WebDriver::Support::Select.new(@driver.find_element(:css, selector))
return select.first_selected_option.text()
end

def setInput(selector, text)
waitForPageToFinishLoading
@driver.find_element(:css, selector).clear;
@driver.find_element(:css, selector).send_keys(text);
end

def setSelectBoxValue(selector, value)
waitForPageToFinishLoading
field = getElement(:css, selector)
if field != nil
select = Selenium::WebDriver::Support::Select.new(field)
@driver.execute_script("$('.container-fluid').css('overflow', 'auto');")
select.select_by(:text, value)
@driver.execute_script("$('.container-fluid').css('overflow', 'visible');")
maximizeWindow
end
end

def setEmptyCountryBoxValue(selector, value)
selector = selector.gsub("'", %q(\\\'))
@driver.execute_script("$('" + selector + "').scope().details.address = {}")
@driver.execute_script("$('" + selector + "').scope().details.address.country = '" + value + "'")
@driver.execute_script("$('" + selector + "').scope().$digest()")
end

def formatTimeAMPM(t)
return t.strftime("%I:%M %P").upcase.gsub(/ /," ")
end

def formatFullDateTime(t)
# dt = DateTime.parse(t.to_s())
## The DateTime function was failing occasionally. There is a known bug with the rounding in new_offset.
## The below fix will only work if the tests are run in time zone EST
t = Time.parse(t.to_s()).in_time_zone("Eastern Time (US & Canada)")
# return dt.new_offset(DateTime.now.offset).strftime('%m/%d/%Y %I:%M %p')
return t.strftime("%m/%d/%Y %I:%M %p")
end

def getTodayInZeroTimeUTC
# Get current time into array
# format is [sec,min,hour,day,month,year,wday,yday,isdst,zone]
a = Time.now.utc.to_a
# Zero out sec, min, hrs positions
a[0] = 0
a[1] = 0
a[2] = 0
# Convert it to date
return Time.utc(*a)
end

def getTodayInZeroTime
# Get current time into array
# format is [sec,min,hour,day,month,year,wday,yday,isdst,zone]
a = Time.now.to_a
# Zero out sec, min, hrs positions
a[0] = 0
a[1] = 0
a[2] = 0
# Convert it to date
return Time.local(*a)
end


def addDays(t, d)
# Convert days into seconds and add it to date
return t+(d*86400)
end


def getElementColor(selector, cssvalue)
rgb = getElement(:css, selector).css_value(cssvalue).gsub(/rgba\(/,"").gsub(/\)/,"").split(",")
color = '#%02x%02x%02x' % [rgb[0], rgb[1], rgb[2]]
return color.upcase
end

def getElementAttribute(csspath, attributeKey)
element = @driver.find_element(:css, csspath)
return element.attribute(attributeKey)

end

def dropdownOption(tagname, css, text)
dropdown_list = @driver.find_element(:css, css)
options = dropdown_list.find_elements(:tag_name, tagname)
options.each { |option| option.click if option.text == text }
selected_option = options.map { |option| option.text if option.selected? }.join
expect(selected_option.text).to eql text
end

end
=end