Selenium click()事件似乎不总是被触发=>导致超时?

这是我做的:

selenium.click("link=mylink"); selenium.waitForPageToLoad(60000); // do something, then navigate to a different page // (window focus is never changed in-between) selenium.click("link=mylink"); selenium.waitForPageToLoad(60000); 

链接“mylink”确实存在,click()的第一次调用始终有效。 但第二次点击()有时似乎有效,有时则不然。

看起来似乎没有触发click()事件,因为页面甚至没有开始加载。 不幸的是,这种行为是不确定的。

这是我已经尝试过的:

  1. 设置更长的时间超时
    =>没有帮助

  2. 加载一页后等待元素存在
    =>不起作用,因为页面甚至没有开始加载

现在我最终调用了click()两次,所以:

 selenium.click("link=mylink"); selenium.waitForPageToLoad(60000); // do something, then navigate to a different page // (window focus is never changed in-between) selenium.click("link=mylink"); selenium.click("link=mylink"); selenium.waitForPageToLoad(60000); 

这将有效,但它不是一个非常好的解决方案。 我也在另一个论坛上看到有人建议写一些像’clickAndWaitWithRetry’的东西:

  try { super.click("link=mylink"); super.waitForPageToLoad(60000); } catch (SeleniumException e) { super.click("link=mylink"); super.waitForPageToLoad(60000); } 

但我认为这也不是一个合适的解决方案….任何想法/解释为什么click()事件有时不会被触发?

有时,看似随机,Selenium只是不喜欢点击某些锚标签。 我不确定是什么导致它,但它发生了。 在那些情况下,我发现有一个麻烦的链接而不是做

 selenium.click(...) 

 selenium.fireEvent( locator, 'click' ); 

正如其他人在我上面所述,我特别关注锚标记,如下所示:

  

我已经做了一段时间的selenium,我真的对waitForPageToLoad()产生了厌恶。 您可能会考虑始终只是等待有问题的元素存在。

我发现这种方法似乎可以解决我遇到的大多数奇怪的问题。 另一种可能性是你可能有一些javascript阻止链接在第一次点击时做任何事情。 这似乎不太可能,但值得仔细检查。

我刚试过WebDriver(Selenium 2.0),发现WebElement #sendKeys(Keys.ENTER)有效。

Selenium click()事件似乎不总是被触发=>导致超时?

在Selenium.click命令之前尝试selenium.pause。 我已经尝试了以上所有,但似乎没有一个解决我们的问题。 所以最后我们得到了一个魔法selenium.pause,这解决了我的问题..

希望这也能解决你的问题

我现在也遇到了这个问题。 从我的用法来看,似乎以下是最一致的:

 @browser.click(selector, {:wait_for => :page}) 

不完全确定为什么会这样。 但似乎如果你这样做:

 @browser.click(selector) [maybe some stuff here too] @browser.wait_for(:wait_for => :page) 

然后你可能最终等待已经加载的页面(即你最终等待永远)。

我挖了Selenium源代码并发现了这个块:

  def click(locator, options={}) remote_control_command "click", [locator,] wait_for options end 

  # Waits for a new page to load. # # Selenium constantly keeps track of new pages loading, and sets a # "newPageLoaded" flag when it first notices a page load. Running # any other Selenium command after turns the flag to false. Hence, # if you want to wait for a page to load, you must wait immediately # after a Selenium command that caused a page-load. # # * 'timeout_in_seconds' is a timeout in seconds, after which this # command will return with an error def wait_for_page(timeout_in_seconds=nil) remote_control_command "waitForPageToLoad", [actual_timeout_in_milliseconds(timeout_in_seconds),] end alias_method :wait_for_page_to_load, :wait_for_page 

基本上,这是做以下事情:

 @browser.click(selector) @browser.wait_for(:wait_for => :page) 

但是,正如评论所述,首先必须立即使用:wait_for命令。

当然……切换订单会使您进入相同的等待状态。

 @browser.wait_for(:wait_for => :page) @browser.click(selector) 

在不知道Selenium的所有细节的情况下,似乎Selenium需要注册:wait_for触发器,当它作为一个选项传递时单击 。 否则,如果你以某种方式告诉Selenium在前一瞬间等待,你可能会永远等待:wait_for被调用。

在这里这个将工作:

 selenium.waitForPageToLoad("60000"); selenium.click("link= my link"); 

我遇到了同样的问题 – 使用Selenium 1.0.12和Firefox 5.0; 我设法通过这种方式使自动化测试工作:

  • 我删除了所有“AndWait”命令(有时它们会挂起测试/浏览器)
  • 我在点击之前添加了暂停
  • 我在点击后添加了一个waitForVisible(通常我等待下一页我要与之交互的下一个html控件)。

它是这样的:

  • waitForVisible好的
  • 暂停1000
  • 单击确定
  • waitForVisible link = Go
  • 暂停1000
  • 单击Go

等等…

似乎“waitForVisible”被太快触发,即在事件处理程序插入控件之前(因此单击控件无效)。 如果你等待1秒钟,它应该插入/激活点击处理程序……

单击时页面未正确加载。 检查页面上的不同元素以确保页面已加载。

此外,等待链接显示并在您单击之前可见。

确保在正确的位置增加超时。 您发布的行是:

 selenium.click("link=mylink"); selenium.waitForPageToLoad(60000); 

此等待是用于加载返回的页面单击后。 但是你描述的问题是它在尝试点击时失败了。 因此,请确保在此之前增加等待。

 selenium.click("link=mylink"); selenium.waitForPageToLoad(60000); // do something, then navigate to a different page // (window focus is never changed in-between) // after the last click in these steps: selenium.waitForPageToLoad(60000); // anything else that happened after that selenium.click("link=mylink"); selenium.waitForPageToLoad(60000); 

如果您使用的是FireFox,请确保使用的是3.6或更高版本。 WaitForPageToLoad使用javascript变量’readyState’,但Firefox仅支持3.6。 早期版本就是不要等待

(参见org.openqa.selenium.internal.seleniumemulation.WaitForPageToLoad

我有同样的问题:(与selenium IDE 1.0.10,phpunit 3.5,selenium RC服务器1.0.3

  EDITED: The culprit seems to be browser FF 3.6.13 , after upgrade to FF 3.6.14 all my errors are gone . My tests are working like charm :). Selenium IDE 1.0.10 PHPUnit: 3.5.6 Selenium Server:selenium-2.0b1 (selenium-2.0b2 is buggy) 
 selenium.click("link=Continue to this website (not recommended)."); Thread.sleep(5000); 

我一直有同样的问题,发现我必须先得到链接的文本。 我知道这不是理想的做法,但我很幸运,我的链接具有独特的名称。

C#代码:

 var text = Selenium.GetText(myLocator); Selenium.Click("link=" + text); 

尝试这个:

 selenium.fireEvent(ID, "keypress");