重复获取StaleElementReferenceError

时间:2015-05-08 07:00:11

标签: ruby selenium-webdriver webdriver watir-webdriver page-object-gem

我正在尝试使用嵌套的iframe自动化应用程序。我的第一种方法是使用watir-webdriver,但是填充每个字段的时间太长了,我输入了很多。我的页面类中的元素示例如下:

in_iframe(:id => 'something') do |frame|
  in_iframe({:id => 'something'}, frame) do |frame|
   in_iframe({:id => 'something'}, frame) do |frame|
    in_iframe({:id => 'something'}, frame) do |frame|
     in_iframe({:id => 'something'}, frame) do |frame|
       text_field(:first_name, :id => 'something', :frame => frame)           
     end
    end
   end
  end
end

在尝试使用watir-webdriver后,我决定继续使用selenium-webdriver,但我反复收到StaleElementReferenceError。我甚至保留了一个开始救援重试块以避免这种情况,但它一直在抛出错误。

所有元素都存储在页面类中,我使用populate_page_with页面类的方法来输入值。

  

my_step.rb

When /^I (?:select|fill in) "(.*)" for (.+) (?:text field|drop down)$/ do |value, page_element|
  wait = Selenium::WebDriver::Wait.new(:timeout => 30)
  wait.until { @current_page.send(page_element.gsub(" ","_").downcase + "_element").exists? }
  @current_page.enter_element_value(page_element, value)
end
  

my_page.rb

class MyPage
  include PageObject

  in_iframe(:id => 'something') do |frame|
    in_iframe({:id => 'something'},frame) do |frame|
      text_field(:my_element, :id => 'something', :frame => frame)
    end
  end
end
  

enter_element_value函数

def enter_element_value(field, value)
  populate_page_with "#{field.downcase.gsub(' ','_')}".to_sym => value
end

我尝试使用selenium函数输入相同的下拉菜单,我能够

sleep 5
@browser.switch_to.frame('GFXLoanSelectorFrame')
@browser.find_element(:id => 'lsProcCombo').find_elements(:tag_name => 'option')[1].click
@browser.switch_to.default_content

如果我再次调用我的步骤输入相同的下拉列表,则会抛出StaleElementReferenceError错误。我不确定究竟是什么导致了这一点。另外,请告诉我是否可以采用任何其他方法来加快执行速度,因为使用watir-webdriver只需要10分钟就可以填充2个屏幕,就像我目标的20%一样。

1 个答案:

答案 0 :(得分:0)

staleelementexception主要是在执行操作并更改状态后松开对象的引用时引起的。这可能是由于ajax调用或dom更新。你可以找到这里讨论的不同方法 How to avoid "StaleElementReferenceException" in Selenium?