2014-09-21 13 views
0

我有寫這個程序來自動執行我在工作中的任務。這是我第一次嘗試編程,沒有任何經驗或訓練,因此可以原諒任何愚蠢的錯誤。 (我刪除的網站和我的用戶名/密碼)Ruby:如果滿足結束標準,則重新運行使用不同代碼的循環

require "rubygems" 
require "selenium-webdriver" 
require "nokogiri" 
browser = Selenium::WebDriver.for :firefox 
wait = Selenium::WebDriver::Wait.new(:timeout => 15) 
#loads to unassigned results page 
browser.get "-----------------" 
p browser.title 
browser.find_element(name: "user[username]").send_keys "--------" 
browser.find_element(name: "user[password]").send_keys "--------" 
browser.find_element(name: "commit").click 
p browser.title 
browser.find_element(class_name: "status_notification").click 
begin 
    browser.find_element(:xpath => ".//*[@id='sub_nav_content']/table/tbody/tr[2]/td[3]/a").click 
    table = wait.until { 
     element = browser.find_element(id: "possible_matched") 
     element if element.displayed? 
    } 
    if table 
     puts "Table Found" 
    else 
     puts "Table Error" 
    end 
    #creates an 2D array containing patient name, admit date and prints to screen 
    names = browser.find_elements(:xpath => ".//*[@id='possible_matched']/table/tbody/tr/td[1]") 
    name_array = [] 
    names.each { |name| name_array << name.text} 
    admits = browser.find_elements(:xpath => ".//*[@id='possible_matched']/table/tbody/tr/td[5]") 
    admit_array = [] 
    admits.each { |date| admit_array << date.text } 
    name_admit_array = name_array.zip(admit_array) 
    name_admit_array.each do |name, date| 
     puts "#{name}: #{date}" 
    end 
    #finds the location of the sub-array containing patient name and collection associated admit date 
    patient_name = browser.find_element(:xpath => ".//*[@id='dialog-modal-cancel-hl7-preview']/table/tbody/tr[2]/td[1]").text 
    collected_date = browser.find_element(:xpath => ".//*[@id='dialog-modal-cancel-hl7-preview']/table/tbody/tr[2]/td[4]").text 
    mo, da, yr = collected_date.split('/').map(&:to_i) 
    cd = [yr, mo, da] 
    bl = name_admit_array.each_with_index.select { |(name, date), i| 
     m, d, y = date.split('/').map(&:to_i) 
     dt = [y, m, d] 
     name.downcase == patient_name.downcase and (dt <=> cd)<0 
    }.map {|x, i| i } 
    # presses the button associated with the correct sub-array 
    blf = name_admit_array.values_at(*bl) 
    if bl.any? 
     bf = blf.rindex(blf.max) + 2 
     browser.find_element(:xpath => ".//*[@id='possible_matched']/table/tbody/tr[#{bf}]/td[6]/div/a").click 
    else 
     browser.find_element(:xpath => "html/body/div[6]/div[1]/a/span").click 
    end 
end while bl.any? 
puts "no name :(" 

所以它運行的循環,直到沒有什麼數組bl中發現的。我想要做的是讓這個循環再次運行,但鏈接列表中的下一個鏈接。所以在循環開始時,它應該執行browser.find_element(:xpath => ".//*[@id='sub_nav_content']/table/tbody/tr[3]/td[3]/a").click而不是browser.find_element(:xpath => ".//*[@id='sub_nav_content']/table/tbody/tr[2]/td[3]/a").click。然後應該以相同的方式運行循環的其餘部分。我希望它在每次循環運行到br.any? => false時繼續增加tr[]

回答

0

您可以創建xpath秒的陣列,併爲他們的each運行這段代碼:

[ 
    ".//*[@id='sub_nav_content']/table/tbody/tr[3]/td[3]/a", 
    ".//*[@id='sub_nav_content']/table/tbody/tr[2]/td[3]/a" 
].each do |path| 
    begin 
     browser.find_element(:xpath => path).click 
     // etc.... 

    end while bl.any? 
end 

我相信會有更多的變化需要調整你的代碼可重用,可根據您的需要

+0

這似乎喜歡它應該工作,但是當我像這樣運行它會得到第二個條目,並給我:元素不再連接到DOM :( – 2014-09-22 15:12:31

相關問題