【问题标题】:Selenium click() event seems not to be always triggered => results in timeout?Selenium click() 事件似乎并不总是被触发 => 导致超时?
【发布时间】:2010-10-12 15:02:48
【问题描述】:

这是我的工作:

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() 有时似乎有效,有时无效。

看起来 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() 事件的任何想法/解释?

【问题讨论】:

  • 当我出于某些原因想要减慢脚本速度时,我通常使用 'setspeed' 而不是超时。

标签: java selenium timeout


【解决方案1】:

有时,Selenium 不喜欢点击某些锚标签,看似随机。我不确定是什么原因造成的,但它确实发生了。在这些情况下,我发现使用麻烦的链接而不是做

selenium.click(...)

selenium.fireEvent( locator, 'click' );

正如其他人在我上面所说的那样,我特别遇到了如下所示的锚标签问题:

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

【讨论】:

  • 嗨,我无法让它工作,它仍然说它有效,但它什么也没做!。 click 命令有效,但一直等待页面加载(当它不应该加载时)。有什么建议吗?
  • 我和 Diego 有同样的问题...有什么建议吗?
  • ASP.NET LinkBut​​ton 控件将自动变成带有“javascript:__doPostback(*”的锚点(当呈现为 HTML 时)。将 LinkBut​​ton 变成 Button 很容易。但是,如果您有一个硬编码的 HTML 锚标记调用 JavaScript,你可能对这个工具不走运。我认为点击永远不会发生,因为 Selenium 在幕后使用 JavaScript,并且可能会覆盖锚的工作——调用 JavaScript。
【解决方案2】:

我已经做了一段时间的 selenium,我真的对 waitForPageToLoad() 产生了厌恶。您可能会考虑总是等待相关元素存在。

我发现这种方法似乎可以解决我遇到的最奇怪的问题。另一种可能性是您可能有一些 javascript 在第一次单击时阻止链接执行任何操作。这似乎不太可能,但值得仔细检查。

【讨论】:

  • 显示链接的页面已完全加载(waitForElement 成功)。这只是一个普通的 html 链接(),没有 JS 交互。链接在导航菜单中,正如我之前写的,第一次点击有效,但第二次似乎没有触发 click() 事件。
  • 嘿,即使我也面临 javascript 超链接的问题。我有一个带有 href="javascript:;" 的按钮。当我使用 selenium-rc 单击它时,浏览器的状态栏显示“javascript:;”,但是没有任何操作发生。有什么解决方法吗??? - Vamyip
  • 发生这种情况时我尝试的第一件事是使用 mouseDown 和 mouseUp 而不是单击。这通常会奏效,即使它有点愚蠢。
  • @blackicecube 这真的很老了,但如果你能分享你最后所做的,那就太好了。您说页面已完全加载,但您似乎在第一次点击之前谈论/正如我在回答中提到的那样,您的描述说您正在导航到另一个页面,所以这可能意味着未加载的问题。跨度>
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    希望这也能解决您的问题

    【讨论】:

      【解决方案5】:

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

      @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 需要在通过 click 作为选项传递时注册 :wait_for 触发器。否则,如果您以某种方式告诉 Selenium 在调用 :wait_for 之前的那一刻等待,您最终可能会永远等待。

      【讨论】:

        【解决方案6】:

        这里可以使用:

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

        【讨论】:

          【解决方案7】:

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

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

          是这样的:

          • waitForVisible OK
          • 暂停1000
          • 点击确定
          • waitForVisible 链接=开始
          • 暂停1000
          • 点击前往

          等等……

          似乎“waitForVisible”触发得太快了,即在事件处理程序插入控件之前(因此单击控件无效)。如果您等待 1 秒,则足以插入/激活点击处理程序...

          【讨论】:

            【解决方案8】:

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

            另外,请等待链接出现并可见,然后再单击它。

            【讨论】:

              【解决方案9】:

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

              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);
              

              【讨论】:

                【解决方案10】:

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

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

                【讨论】:

                  【解决方案11】:

                  我有同样的问题 :( 使用 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)
                  

                  【讨论】:

                    【解决方案12】:
                    selenium.click("link=Continue to this website (not recommended).");
                    Thread.sleep(5000);
                    

                    【讨论】:

                      【解决方案13】:

                      我遇到了同样的问题,发现我必须先获取链接的文本。我知道这不是理想的方法,但我很幸运我的链接是唯一命名的。

                      C#代码:

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

                      【讨论】:

                        【解决方案14】:

                        试试这个:

                        selenium.fireEvent(ID, "keypress");
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-07-26
                          • 2014-05-29
                          • 2011-08-31
                          相关资源
                          最近更新 更多