2014-09-22 1 views
0

그래서 내 코드는 나에게주고있다 [remote server] resource://fxdriver/modules/web-element-cache.js:8325:24:in `fxdriver.cache.getElementAt': Element is no longer attached to the DOM (Selenium::WebDriver::Error::StaleElementReferenceError)StaleElementReferenceError를주는 요소는 무엇입니까?

이 코드에서 사용되는 여러 가지 요소가 있으며, 나는 그것을 위해 wait이 있는지 확인 할 수 있도록 나에게 오류를 제공하는 요소를 참조하는 것을 시도하고있다. 오류의 전체 스택 추적, 그것은 예외를 던졌다 정확한 라인을 가리 것이다

path = [".//*[@id='sub_nav_content']/table/tbody/tr[2]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[3]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[4]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[5]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[6]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[7]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[8]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[9]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[10]/td[3]/a", ".//*[@id='sub_nav_content']/table/tbody/tr[11]/td[3]/a"] 
path.each do |path| 
    begin 
     wait.until { 
      element = browser.find_element(:xpath => path) 
      element if element.displayed? 
     } 
     browser.find_element(:xpath => path).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 
     puts patient_name 
     puts collected_date 
     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 } 

     blf = name_admit_array.values_at(*bl) 
     if bl.any? 
      bf = blf.rindex(blf.max) + 2 
      wait.until { 
       element = browser.find_element(:xpath => ".//*[@id='possible_matched']/table/tbody/tr[#{bf}]/td[6]/div/a") 
       element if element.displayed? 
      } 
      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? 
end 
+0

코드에 추가하십시오. 일반적으로'StaleElementException'은 엘레멘트가있을 때 페이지가 바뀌고 페이지가 바뀐 후에 엘레멘트를 사용하려고 할 때 발생한다. 페이지의 클릭 또는 다른 페이지를 방문하여 돌아가서 페이지가 변경 될 수 있습니다. 대부분의 경우 페이지에서 변경 작업이 수행 된 후에 요소에 대한 새로운 참조가 확보되도록하면 해결할 수 있습니다. – Richard

+0

코드가 추가되었습니다. 무슨 일이 일어나고 있는지 (xpath가 동일하게 유지 되더라도 DOM이 업데이트되기 때문에 요소가 변경되고있다.) 나는 그것을 고치거나 정확히 언제 일어나는지를 모른다. –

답변

0

확인 :

편집 다음은 코드입니다.

+0

죄송 합니다만 전 완전히 새로운 것입니다. 스택 트레이스는 어떻게 확인합니까? –

관련 문제