Selenium click()事件似乎并不总是被触发=>结果超时?

时间:2009-03-11 07:01:13

标签: java selenium timeout

这就是我的所作所为:

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. 加载一页后等待元素出现 =>由于页面甚至没有开始加载

  3. ,因此无效

    现在我最终调用了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()事件没有被触发的想法/解释?

14 个答案:

答案 0 :(得分:10)

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

selenium.click(...)

DO

selenium.fireEvent( locator, 'click' );

正如其他人在我上面所述,我特别遇到锚标记问题,如下所示:

<a href="javascript:...." >

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

我刚试过WebDriver(Selenium 2.0),发现WebElement #sendKeys(Keys.ENTER)可以正常工作。

答案 3 :(得分:3)

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

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

希望这也能解决你的问题

答案 4 :(得分:2)

这个可行:

selenium.waitForPageToLoad("60000");

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

答案 5 :(得分:2)

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

@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被调用。

答案 6 :(得分:2)

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

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

它是这样的:

  • waitForVisible OK
  • 暂停1000
  • 点击确定
  • waitForVisible link = Go
  • 暂停1000
  • 点击开始

等...

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

答案 7 :(得分:1)

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

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

答案 8 :(得分: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);

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

试试这个:

selenium.fireEvent(ID, "keypress");

答案 11 :(得分:0)

selenium.click("link=Continue to this website (not recommended).");
Thread.sleep(5000);

答案 12 :(得分:0)

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

C#代码:

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

答案 13 :(得分:0)

我遇到了同样的问题:(使用selenium IDE 1.0.10,phpunit 3.5,selenium RC server 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)