10

在某些未知情况下,当使用 open 方法时,selenium 不会检测到页面已加载。我正在使用 Java API。例如(此代码不会产生此错误。我不知道会有外部可见页面。):

Selenium browser = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com");
browser.start();
browser.open("http://www.google.com/webhp?hl=en");
browser.type("q", "hello world");

发生错误时,对“打开”的调用会超时,即使您可以清楚地看到在超时发生之前页面已成功加载。增加超时没有帮助。对“类型”的调用从未发生,也没有取得任何进展。

发生此错误时,如何让 selenium 识别页面已加载?

4

9 回答 9

2

我最近遇到了这个问题。

所有基于 JS 的解决方案都不太适合我拥有的 ICEFaces 2.x + Selenium 2.x/Webdriver 组合。

我所做的和对我有用的如下:

在屏幕的一角,有连接活动指示器。

            <ice:outputConnectionStatus id="connectStat"
                                        showPopupOnDisconnect="true"/>

在我的 Java 单元测试中,我等到它的“空闲”图像再次出现:

private void waitForAjax() throws InterruptedException {
    for (int second = 0;; second++) {
        if (second >= 60) fail("timeout");
        try { 
            if ("visibility: visible;".equals(
                selenium.getAttribute("top_right_form:connectStat:connection-idle@style"))) { 
                break;
            }
        } catch (Exception e) {

        }
        Thread.sleep(1000);
    }
}

如果不需要在页面上显示此指示器,您可以在生产构建中禁用此指示器的呈现,或者使用空的 1x1 gif 作为其图像。

100% 工作(使用弹出窗口、推送消息等)并使您从为每个元素分别指定 waitForElement(...) 的地狱中解脱出来。

希望这可以帮助某人。

于 2011-11-10T11:54:17.383 回答
2

也许这会对你有所帮助......

考虑以下方法在名为 Functions.java 的页面中

public static void waitForPageLoaded(WebDriver driver) {

         ExpectedCondition<Boolean> expectation = new
    ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
              return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
            }
          };

          WebDriverWait wait = new WebDriverWait(driver,30);
          try {
                  wait.until(expectation);
          } catch(Throwable error) {
                  Assert.assertFalse(true, "Timeout waiting for Page Load Request to complete.");
          }
     } 

您可以将此方法调用到您的函数中。由于是静态方法,可以直接用类名调用。

public class Test(){
    WebDriver driver;

    @Test
    public void testing(){
         driver = new FirefoxDriver();
         driver.get("http://www.gmail.com");
         Functions.waitForPageLoaded(driver);
   }
}
于 2014-08-08T03:21:35.953 回答
1

使用 'openAndWait' 代替 'open' 就可以了。

网站

许多动作可以用“AndWait”后缀调用,例如“clickAndWait”。这个后缀告诉 Selenium 该操作将导致浏览器调用服务器,并且 Selenium 应该等待新页面加载。

于 2008-09-18T19:44:28.830 回答
1

当我进行 Selenium 测试时,我会等待查看某个元素是否可见(waitForVisible),然后执行我的操作。我通常会尝试在我输入的元素之后使用一个元素。

于 2008-09-17T22:25:05.287 回答
0

在使用 Selenium 测试带有 iFrame 的应用程序时,我遇到了类似的问题。基本上,似乎一旦加载了主页面(包含 iframe 的页面),Selenium 就无法确定 iframe 内容何时完成加载。

通过查看您尝试加载的链接的来源,似乎有一些 Javascript 在页面加载后会创建额外的页面元素。我不能确定,但​​这可能是导致问题的原因,因为它似乎与我在上面遇到的情况相似。

您在加载静态页面时是否遇到相同类型的错误?(即,带有直接 html 的东西)

如果您无法获得更好的答案,请尝试 selenium 论坛,它们通常非常活跃,而且 Selenium 开发人员确实会回答好的问题。

http://clearspace.openqa.org/community/selenium_remote_control

此外,如果您还没有尝试过,请在调用 open 之后添加对 browser.WaitForPageToLoad("15000") 的调用。我发现在每次页面转换之后执行此操作会使我的测试更加可靠,即使从技术上讲它不应该是必需的。(当 Selenium 检测到页面实际上已经加载时,它会继续,所以实际的超时变量并不是真正的问题......

于 2008-09-18T12:41:09.380 回答
0

启用“multiWindow”功能解决了这个问题,但我不清楚原因。

SeleniumServer(int port, boolean slowResources, boolean multiWindow)

SeleniumServer server = new SeleniumServer(4444, false, true);

任何澄清都会有所帮助。

于 2008-09-17T22:25:27.970 回答
0

不是一个完美的解决方案,但我正在使用这种方法

$t1 = time(); // current timestamp
$this->selenium->waitForPageToLoad(30);
$t2 = time();

if ($t2 - $t1 >= 28) {
    // page was not loaded
}

因此,这是一种检查页面是否在指定时间内未加载,因此未加载。

于 2013-04-21T09:22:08.883 回答
0

如果您的页面没有 AJAX,请尝试寻找页面的页脚(我也使用 Junit fail(""),您可以System.err.println()改用):

    element.click();
    int timeout =120; 
    // one loop = 0.5 sec, co it will be one minute 
    WebElement myFooter = null;

    for(int i=0; i<timeout; i++){
      myFooter = driver.findElement(By.id("footer"));
      if(myFooter!= null){
        break;
      }
      else{
        timeout--;
      }
}
if(timeout==0 && myFooter == null){
  fail("ERROR! PAGE TIMEOUT");
}
于 2013-09-18T11:15:51.430 回答
0

另一个想法是修改 AJAX API(在 AJAX 操作之后添加一些文本)。ajax 动作完成后,在返回之前,将不可见字段设置为 TRUE,selenium 会找到它并读取为绿灯

在 html 中:

<input type='hidden' id="greenlight">

在硒中

if(driver.findElement(By.id("greenlight")).getAttr("value").equals("TRUE")){
    // do something after page loading
}
于 2013-09-18T11:22:20.513 回答