Webdriver错误:元素不可点击(-99999800,242.5)通过watir-webdriver驱动Facebox控件

时间:2011-12-06 18:49:57

标签: webdriver watir facebox watir-webdriver

我正在使用带有chrome的watir-webdriver来自动化我的测试,现在我有点卡住了。 我在facebox中有一个表单(defunkt.io/facebox)。您可以看到此表单中有许多复选框:

irb(main):113:0> b.checkboxes.size
=> 122

我的问题是,当我尝试设置其中一个复选框时,我收到以下错误:

irb(main):111:0> b.checkbox(:id => 'week_0').set 1
Selenium::WebDriver::Error::UnknownError: Element is not clickable at point (-99999800, 242.5)
Backtrace:
    0x8088d3a
    0x8076225
    0x807c718
    0x807c9e7
    0x807f6b7
    0x808009d
    0x8067c5c
    0x8074931
    0x8059fda
    0x80d1d4d
    0x80d3773
    0x80d3aa3
    start_thread [0x5e9e99]
    0x10b973e

from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/response.rb:50:in `assert_ok'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/http/common.rb:58:in `new'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/http/common.rb:58:in `create_response'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/http/default.rb:64:in `request'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/http/common.rb:39:in `call'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/bridge.rb:450:in `raw_execute'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/bridge.rb:428:in `execute'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/remote/bridge.rb:264:in `clickElement'
from /usr/local/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.14.0/lib/selenium/webdriver/common/element.rb:34:in `click'
from /usr/local/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.3.9/lib/watir-webdriver/elements/checkbox.rb:25:in `set'
from (irb):111
from /usr/local/bin/irb:12:in `<main>'

我应该怎么做才能在chrome上使用watir-webdriver处理facebox?

编辑:

我发现了Chuck的TIP问题(在inspect element工具中查看元素属性)。 所以我注意到复选框的左侧位置是-999999px。

解决方案:

browser.execute_script("$('[type=checkbox]').removeClass('ui-helper-hidden-accessible')")

(因为这是造成左移位的班级)

3 个答案:

答案 0 :(得分:1)

我发现了Chuck的TIP问题(在inspect element工具中查看元素属性)。所以我注意到复选框的左侧位置是-999999px。

解决方案:

browser.execute_script("$('[type=checkbox]').removeClass('ui-helper-hidden-accessible')")

(因为这是造成左移位的班级)

答案 1 :(得分:0)

错误让我认为事情可能不会以某种方式显示或活动。脚本是否在尝试与之交互时实际显示灯箱?您是否需要插入一个简短的暂停或等待复选框被渲染以及“弹出”灯箱以完成它的javascript代码?

如果它不可见,那么我可以看到它产生了你正在获得的那种错误。 同样,如果脚本的速度有点太快,那也可能是问题所在。

使用开发人员工具(在chrome中你可以右键单击一个元素并选择'inspect element')并查看相关元素的属性(特别是位置),以及'tree'中的元素(因为它)那个包含它的人。

你可以通过更改类或改变类的CSS来暂时“重新定位”对象以使Watir认为它是可见的,从而对此进行暴力破解。我必须为使用悬停状态隐藏或显示菜单的东西做类似的事情,无论出于什么原因'onmouseover'事件都不足以让浏览器应用不同的css伪造类。如果您已经在使用jquery,那么可以调用一些非常简单的函数来执行此类操作。 (你的一个开发人员可能能够帮助你)你可以使用.execute_script来调用代码,如果需要的话。

答案 2 :(得分:0)

试试这个。它将使用Javascript将元素移动到视图中。为我工作。

module Watir
  class Element
    def move_into_view
      browser.execute_script(%Q[
        var element = arguments[0];
        element.style.position = 'absolute';
        element.style.left = '10px';
        element.style.top = '10px';
        return true;],
        self )
    end
  end
end