我正在尝试使用嵌套的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%一样。
答案 0 :(得分:0)
staleelementexception主要是在执行操作并更改状态后松开对象的引用时引起的。这可能是由于ajax调用或dom更新。你可以找到这里讨论的不同方法 How to avoid "StaleElementReferenceException" in Selenium?