Selenium - дождитесь выполнения функции Javascript, прежде чем продолжить - PullRequest
3 голосов
/ 15 февраля 2012

В настоящее время я создаю несколько тестовых случаев с Selenium, и я столкнулся с проблемой.

В моем тестовом примере веб-сайт, через который я пытаюсь пройти, имеет небольшую форму и кнопку для поиска. Нет проблем, заполнив форму и нажав кнопку. Проблема возникает, если щелкнуть по ней.

После нажатия на кнопку эта функция называется:

function muestraEspera(){
document.getElementById("divCargando").style.display = "";
}

По сути, это делает видимым DIV, который содержит «загрузочное» изображение, поэтому посетитель просто видит изображение и не сможет увидеть сайт, загружающий контент до его завершения (контент загружается с помощью ajax).

После загрузки содержимого выполняется эта функция:

function escondeEspera(){
document.getElementById("divCargando").style.display = "none";
}

Что в основном скрывает "загрузочный" DIV, чтобы посетитель мог видеть результаты.

Теперь я не могу использовать SLEEPS, потому что загрузка может занять больше или меньше, и потому что мне нужно реальное время выполнения веб-сайта. Есть ли способ (с помощью java - junit4) заставить селен подождать, пока вторая функция будет выполнена, прежде чем продолжить выполнение следующих шагов?

РЕДАКТИРОВАТЬ: я использую Selenium RC. Для запуска драйвера я использую:

public void setUp() throws Exception {
        selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "website-url");
        selenium.start();
    }

В конце, решение, которое отлично сработало для меня, данное Павлом Яничеком:

boolean doTheLoop = true;
      int i = 0;
      while (doTheLoop){      
      i= i+200;
      Thread.sleep(1000);
      if (i>30000){
        doTheLoop = false;
      }
      if (!selenium.isVisible("id=divCargando")){
         doTheLoop = false;
      }      
      if (selenium.isVisible("id=divCargando")){
             doTheLoop = true;
          }      
     }

Ответы [ 3 ]

4 голосов
/ 15 февраля 2012

Вы можете использовать waitForCondition
А если вы используете WebDriver, вы можете попробовать WebDriverBackedSelenium или FluentWait.
Я думаю эта ссылка поможет.

3 голосов
/ 15 февраля 2012

Вы должны попробовать это. Он ожидает до указанного времени ожидания. И то, что он ждет, указано в FluentWait-объекте. Он ждет, пока логическое значение не станет истинным. Поэтому, если ваш элемент больше не виден, логическое значение становится истинным, и метод перестает ждать. Хорошая вещь в этом заключается в том, что каждые 1 секунду он спрашивает, виден ли ваш элемент, а не спрашивает так быстро, как может, что не имеет смысла.

public static void wait(WebDriver driver, int timeout, final By locator){
    FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
       .withTimeout(timeout, TimeUnit.SECONDS)
       .pollingEvery(1, TimeUnit.SECONDS)
       .ignoring(NoSuchElementException.class)

    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            WebElement element = driver.findElement(locator);
            return !element.isDisplayed();
        }
    });
}

РЕДАКТИРОВАТЬ: как вы писали в ваших комментариях и в вашем редакторе, кажется, что вы используете Selenium 1. WebDriver является частью Selenium 2. Так что просто получите упакованный драйвер, как это:

Selenium selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "website-url");
CommandExecutor executor = new SeleneseCommandExecutor(selenium); 
WebDriver driver = new RemoteWebDriver(executor, new DesiredCapabilities());
2 голосов
/ 15 февраля 2012

** РЕДАКТИРОВАТЬ 3 **

Итак, у нас есть:

DefaultSelenium selenium = new DefaultSelenium("localhost",4444,"*iexplore", "websiteURL");

Тем не менее вы можете использовать команду isVisible, например:

boolean doTheLoop = true;
    int i = 0;
    while (doTheLoop){      
        i = i+200;
        Thread.sleep(200);
        if (i>30000){
            doTheLoop = false;
        }
        if (!selenium.isVisible("id=the ID Of element")){
            doTheLoop = false;
      }      
}

Надеждавы не попадете в бесконечный цикл.

Я никогда не работал с DefaultSelenium, поэтому, пожалуйста, используйте функцию isVisible() так же, как вы используете, например, click().

...