그래서 내 코드는 나에게주고있다 [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
코드에 추가하십시오. 일반적으로'StaleElementException'은 엘레멘트가있을 때 페이지가 바뀌고 페이지가 바뀐 후에 엘레멘트를 사용하려고 할 때 발생한다. 페이지의 클릭 또는 다른 페이지를 방문하여 돌아가서 페이지가 변경 될 수 있습니다. 대부분의 경우 페이지에서 변경 작업이 수행 된 후에 요소에 대한 새로운 참조가 확보되도록하면 해결할 수 있습니다. – Richard
코드가 추가되었습니다. 무슨 일이 일어나고 있는지 (xpath가 동일하게 유지 되더라도 DOM이 업데이트되기 때문에 요소가 변경되고있다.) 나는 그것을 고치거나 정확히 언제 일어나는지를 모른다. –