你怎么得到selenium来识别一个页面加载?

时间:2008-09-17 22:18:29

标签: java selenium

在某些未知情况下,selenium在使用open方法时未检测到页面已加载。我正在使用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识别页面已加载?

9 个答案:

答案 0 :(得分: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(...)。

希望这有助于某人。

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

答案 2 :(得分:1)

当我进行Selenium测试时,我等着看某个元素是否可见(waitForVisible),然后我就开始行动了。我经常尝试在输入之后使用一个元素。

答案 3 :(得分:1)

使用'openAndWait'代替'open'就行了。

来自website

  

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

答案 4 :(得分:0)

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

SeleniumServer(int port,boolean slowResources,boolean multiWindow)

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

任何澄清都会有所帮助。

答案 5 :(得分:0)

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

通过查看您尝试加载的链接的来源,看起来有一些Javascript在页面加载后创建了其他页面元素。我无法确定,但这可能导致问题,因为它似乎与我上面遇到的情况类似。

加载静态页面时会出现同样的错误吗? (即直接html的东西)

如果您无法获得更好的答案,请尝试使用selenium论坛,他们通常非常活跃,而Selenium开发者会回答好问题。

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

此外,如果您还没有尝试过,请在打开调用后添加对browser.WaitForPageToLoad(“15000”)的调用。我发现在每次页面转换后执行此操作会使我的测试更加稳固,即使技术上不需要它。 (当Selenium检测到页面实际已加载时,它会继续,因此实际的超时变量并不是真正的问题。

答案 6 :(得分:0)

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

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

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

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

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

答案 8 :(得分:0)

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

in html:

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

在硒中

if(driver.findElement(By.id("greenlight")).getAttr("value").equals("TRUE")){
    // do something after page loading
}