Как вы получаете селен, чтобы распознать, что страница загружена? - PullRequest
10 голосов
/ 18 сентября 2008

В некоторых неизвестных ситуациях селен не обнаруживает загрузку страницы при использовании метода 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");

При возникновении ошибки время вызова «open» истекает, даже если вы четко видите, что страница успешно загружена до истечения времени ожидания. Увеличение таймаута не помогает. Вызов «type» никогда не происходит, никакого прогресса не происходит.

Как вы получаете селен, чтобы распознать, что страница была загружена при возникновении этой ошибки?

Ответы [ 9 ]

2 голосов
/ 10 ноября 2011

Я столкнулся с этой проблемой совсем недавно.

Все решения на основе 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 в качестве изображений.

Работает на 100% (с всплывающими окнами, отправленными сообщениями и т. Д.) И освобождает вас от необходимости указывать waitForElement (...) для каждого элемента в отдельности.

Надеюсь, это кому-нибудь поможет.

2 голосов
/ 08 августа 2014

Может быть, это поможет вам ....

Рассмотрим следующий метод на странице под названием 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);
   }
}
1 голос
/ 18 сентября 2008

Использование 'openAndWait' вместо 'open' поможет.

С сайта :

Многие действия могут вызываться с суффиксом AndWait, например "ClickAndWait". Этот суффикс сообщает Selenium, что это действие приведет к тому, что браузер выполнит вызов сервера, и что Selenium должна дождаться загрузки новой страницы.

1 голос
/ 18 сентября 2008

Когда я делаю тестирование Selenium, я жду, чтобы увидеть, видим ли определенный элемент (waitForVisible), затем я делаю свое действие. Я обычно пытаюсь использовать элемент после того, как набираю.

0 голосов
/ 18 сентября 2013

Другая идея состоит в том, чтобы изменить AJAX API (чтобы добавить текст после действий AJAX). После того, как действие ajax было завершено, перед возвратом установите для невидимого поля значение TRUE, селен найдет его и прочитает зеленый свет

в html:

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

в селене

if(driver.findElement(By.id("greenlight")).getAttr("value").equals("TRUE")){
    // do something after page loading
}
0 голосов
/ 18 сентября 2013

Если на вашей странице нет 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");
}
0 голосов
/ 21 апреля 2013

Не идеальное решение, но я использую этот метод

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

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

Итак, это своего рода проверка, если страница не была загружена в течение указанного времени, поэтому она не загружается.

0 голосов
/ 18 сентября 2008

Я столкнулся с похожими проблемами при использовании Selenium для тестирования приложения с iFrames. По сути, казалось, что после загрузки основной страницы (страницы, содержащей элементы iframe) Selenium не смог определить, когда содержимое элемента iframe закончило загрузку.

Если посмотреть на источник ссылки, которую вы пытаетесь загрузить, похоже, что существует некоторый Javascript, который создает дополнительные элементы страницы после загрузки страницы. Я не могу быть уверен, но возможно, что это является причиной проблемы, так как она кажется похожей на ситуацию, с которой я столкнулся выше.

Вы получаете такие же ошибки при загрузке статической страницы? (т.е. что-то с прямым HTML)

Если вы не можете получить лучший ответ, попробуйте форумы по селену, они обычно довольно активны, и разработчики Selenium отвечают на хорошие вопросы.

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

Кроме того, если вы еще не пробовали, добавьте вызов в browser.WaitForPageToLoad ("15000") после вызова, чтобы открыть. Я обнаружил, что выполнение этого после каждого перехода страницы делает мои тесты немного более надежными, хотя технически это не требуется. (Когда Selenium обнаруживает, что страница действительно загружена, она продолжается, поэтому фактическая переменная тайм-аута на самом деле не имеет значения ..

0 голосов
/ 18 сентября 2008

Включение функции 'multiWindow' решило проблему, хотя я не понимаю, почему.

SeleniumServer (int port, логический slowResources, логическое многоокно)

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

Любые разъяснения будут полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...