无法单击存在的输入类型=“按钮”,但它不可见

时间:2014-07-08 14:35:08

标签: firefox selenium selenium-webdriver watir watir-webdriver

首先......我尽我所能,并尝试了我发现的一切!!

在WinXp中安装了以下gem:

Watir-webdriver 0.6.10 | selenium-webdriver 2.42.0 | Firefox 30

我在输入标记元素中有一个type ="按钮",我确定它存在于浏览器中(返回true存在?),但是它是虽然对用户可见,但是对watir不可见(将false返回到可见?或存在?)。

我已经尝试了.hover,.fire_event" onmouseover",。click&fire_event(" onclick")方法,没有人解决问题。

第一个我遇到本机事件问题是否在firefox中禁用本机事件,如watir webdriver网站中所建议的那样。

b.div(:class, "buttons btnGuardarCancelar").button(:id, "guardar").hover
b.div(:class, "buttons btnGuardarCancelar").button(:id, "guardar").when_present.click

第二个我得到了一个真正的答案,但没有任何反应,即使在该命令之后有wait_until_present或when_present。

b.div(:class, "buttons btnGuardarCancelar").button(:id, "guardar").fire_event("onmouseover")
b.div(:class, "buttons btnGuardarCancelar").button(:id, "guardar").when_present.click

第三次我得到超时,说元素不可见。

b.div(:class, "buttons btnGuardarCancelar").button(:id, "guardar").when_present.click

使用最后一个触发其他onclick事件,但不会触发与我指示的按钮相关联的事件。

b.div(:class, "buttons btnGuardarCancelar").button(:id, "guardar").fire_event("onclick")

还尝试使用以下xpath:

b.element(:xpath, "//input[@id='guardar']").when_present.click

b.button(:xpath, "//input[@id='guardar']").when_present.click

代码如下:

<div class="buttons btnGuardarCancelar" name="">
 <input id="cancelar" class="formButton margingleft" type="button" value="Cancelar"  onclick="openUserServiceConfigMenu(1);" tabindex="12"></input>
 <input id="guardar" class="formButton margingleft" type="button" value="Guardar" name="guardar" onclick="sendForm();" tabindex="12"></input>
</div>

两个按钮的行为相同。我不知道该怎么做才能让它发挥作用。重要的是说我无法控制网站。

附加组件: 1)它在人类用户直接交互时起作用。 2)它也不通过irb工作。 3)我不需要点击任何其他按钮来访问此按钮。

编辑:

刚试过:

b.element(:css, "div.buttons.btnGuardarCancelar > input[name=guardar]").click

收到以下错误:

[remote server] file:/// D:/ DOCUME~1 / p056988 / LOCALS~1 / Temp / webdriver-profile20140 708-5676-32980a/extensions/fxdriver@googlecode.com/components/command_processor。 js:8791:5:在`fxdriver.preconditions.visible&#39;:元素当前不可见 因此可能无法与之交互(Selenium :: WebDriver :: Error :: ElementNotVisible 误差)...

4 个答案:

答案 0 :(得分:2)

好吧,发现我的答案......昨天试着回答,但由于我的代表仍然很低,所以直到我发布后8小时才能回答。

在深入研究网站代码后,使用Firefox内置检查器,我发现了问题......

似乎在同一页面中有一些其他按钮,具有相同的标识符 - html就像我试图解决的那样 - 但它们是隐藏的,所以watir-webdriver尝试点击它获得的第一个html页面代码,它得到一个不可见的错误。

我设法通过编辑按钮父母来解决问题更具体,从第一个&#34;现在开始?== true&#34;路径中的元素。

b.td(:class, "tab_user_service_options").div.div.div.div(:class, "buttons btnGuardarCancelar").button(:id, "guardar").click

感谢您的所有答案。

干杯。

答案 1 :(得分:0)

有时.click不起作用。有许多不同的因素可能导致这种情况,这实际上取决于您的应用程序的实现。利用OpenQA.Selenium.Interactions.Actions类来模拟用户移动,而不是在元素上执行click事件。

    OpenQA.Selenium.Interactions.Actions actions = new OpenQA.Selenium.Interactions.Actions(driver);
    actions.MoveToElement([IWebElementGoesHere]).Perform();
    actions.click().Perform();

这会将鼠标移动到所需位置,然后单击它。根据您之前的评论,您可以找到Web元素,因此它应该用于移动鼠标并单击那里。还有actions.click([IWebElementGoesHere]).Perform();我发现它通常也可以使用,但是如果它没有,那么你可以使用移动然后点击。

根据您的应用程序,您可能需要移动鼠标并在点击之前等待,如果发生了一些幕后操作......但这完全取决于您的应用程序的实现。

答案 2 :(得分:0)

您尝试点击的元素&#39;最有可能被覆盖的&#39;通过另一个元素(可能是&span;&#39;元素)。元素将返回&#39;存在?&#39;但是不可点击&#39;,&#34;因为另一个元素会收到点击&#34;

在网站上,我目前正在测试用户界面将使用&#39; span&#39;样式化页面上的元素。所以看起来我点击了一个按钮&#39; element,实际上我点击了按钮元素顶部的跨度。

我建议使用Selenium IDE并记录流程,它应该为您提供一些关于您可以在脚本中使用的元素的线索。

答案 3 :(得分:0)

根据Watir的documentation,它首先检查元素是否存在(返回该元素是否实际存在),以及哪个元素不是visible。因此,在执行任何操作之前,元素应该是可见的。

def click
  assert_exists
  assert_enabled
  @element.click
  run_checkers
end

我通常会检查元素是否存在,然后检查元素是否已预设。如果不使用,请wait_until_present然后执行任何所需的操作。

browser.element(:css => locator).wait_until_present
browser.element(:css => locator}").click

尝试这个,如果这适合你,还原!