27

这就是我所做的:

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() 事件?

4

14 回答 14

10

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

selenium.click(...)

selenium.fireEvent( locator, 'click' );

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

<a href="javascript:...." >
于 2009-07-29T18:19:33.977 回答
4

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

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

于 2009-03-15T18:14:38.093 回答
3

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

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

希望这也能解决您的问题

于 2011-06-06T11:38:39.910 回答
3

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

于 2010-01-26T18:01:29.050 回答
2

在这里,这个将起作用:

selenium.waitForPageToLoad("60000");

selenium.click("link= my link");
于 2010-11-16T11:32:56.420 回答
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 触发器作为选项传递时注册click。否则,如果您以某种方式告诉 Selenium 在调用 :wait_for 之前的那一刻等待,您最终可能会永远等待。

于 2011-03-03T00:28:41.057 回答
2

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

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

它是这样的:

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

ETC...

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

于 2011-06-30T12:26:38.680 回答
1

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

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

于 2009-03-14T18:39:05.377 回答
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);
于 2009-03-14T20:38:47.723 回答
1

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

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

于 2011-03-29T05:59:13.890 回答
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)
于 2011-02-25T16:31:21.390 回答
0
selenium.click("link=Continue to this website (not recommended).");
Thread.sleep(5000);
于 2010-07-20T11:02:19.150 回答
0

尝试这个:

selenium.fireEvent(ID, "keypress");
于 2010-04-21T14:03:44.580 回答
0

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

C#代码:

var text = Selenium.GetText(myLocator);
Selenium.Click("link=" + text);
于 2011-02-01T18:23:18.720 回答