【问题标题】:How do you get selenium to recognize that a page loaded?你如何让 selenium 识别页面加载?
【发布时间】:2010-09-10 10:29:40
【问题描述】:

在某些未知情况下,当使用 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");

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

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

【问题讨论】:

    标签: java selenium


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      SeleniumServer(int port, boolean slowResources, boolean multiWindow)

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

      任何澄清都会有所帮助。

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          来自website

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

          【讨论】:

          • 问题是关于 Selenium RC API,它不支持“AndWait”部分。这仅在 Selenium IDE 中。
          • 同意,这不是一个有用的答案。不仅“...AndWait”方法在 Java API 中不可用,而且这里的整个问题是 Selenium 没有正确检测页面何时完成加载。无论如何,使用这些方法无济于事。 release.seleniumhq.org/selenium-core/0.8.0/…
          【解决方案5】:

          我最近遇到了这个问题。

          所有基于 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(...) 的地狱中解脱出来。

          希望这对某人有所帮助。

          【讨论】:

            【解决方案6】:

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

            $t1 = time(); // current timestamp
            $this->selenium->waitForPageToLoad(30);
            $t2 = time();
            
            if ($t2 - $t1 >= 28) {
                // page was not loaded
            }
            

            所以,这是一种检查页面是否在指定时间内没有加载,所以它没有加载。

            【讨论】:

              【解决方案7】:

              如果您的页面没有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");
              }
              

              【讨论】:

              • findElement() 将在未找到页脚元素时抛出异常。你不会得到你尝试在那里编程的 60 次尝试。
              【解决方案8】:

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

              在 html 中:

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

              在硒中

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

              【讨论】:

                【解决方案9】:

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

                考虑以下方法在名为 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);
                   }
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2010-11-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多