3

我正在尝试在动态加载的SelectList元素中选择一个项目。

我正在使用 wait_until ,如下所示:

select_list(:oem, :id => 'oem_1')

def wait_for_oem(oem_name)
  self.oem_element.wait_until(20) do
    self.oem_options.include? oem_name
  end
end

当我的列表只有几个项目时,这很有效。不幸的是,我的清单有时有3000项。发生这种情况时,上述等待需要几分钟才能返回(即使列表只需几秒钟即可填充)。

我也试过:

def wait_for_oem(oem_name)
  self.oem_element.wait_until(20) do
    self.oem_options.length > 1
  end
end

这并没有更好,我可以sleep 5解决这个问题,但我宁愿避免这种情况。

你能推荐性能更好的等待选项吗?

4

2 回答 2

3

我相信最大的成本是检索所有 3000 个选项,这是页面对象 gem 在调用oem_options. 通过直接定位该特定选项,您应该获得性能提升。

似乎没有办法直接在页面对象 gem 中定位选项。因此,您将需要直接访问底层的 selenium/watir 方法。

在 Watir-Webdriver 中:

def wait_for_oem(oem_name)
  self.oem_element.wait_until(20) do
    self.oem_element.element.option(:text => oem_name).exists?
  end
end  

在 Selenium-Webdriver 中:

def wait_for_oem(oem_name)
  self.oem_element.wait_until(20) do
    begin
      self.oem_element.element.find_element(:xpath => "./option[text()=#{oem_name}]")
    rescue
      false
    end
  end
end  

使用上述方法检查一个包含 3000 个选项的选择列表,时间从 86 秒减少到 0.25 秒。

于 2014-02-24T21:38:49.717 回答
2

您可以在选择列表中设置一个元素并测试它是否存在:

select_list(:oem, :id => 'oem_1')

在你的等待中:

wait_until(10, 'wait for oem option') do
  oem_element.selected_options.size > 0
end

这样做效果更好,还是仍然尝试扫描所有对象?

ETA:这还取决于您是使用 watir-webdriver 还是 selenium-webdriver 作为后端来提高性能,至少在涉及 cheezy 对象的情况下:

水网驱动程序:

def select(value)
  element.select(value)
end

硒网络驱动程序:

def select(value)
  find_options.find do |option|
    option.text == value
  end.click
end

当您深入研究 watir 时,主要原因是 watir 使用它生成的 xpath 来更有效地选择选项,而 selenium 似乎在该select级别没有提供这样的选项。

于 2014-02-25T18:38:18.880 回答