2014-01-07 3 views
3

При автоматизации функции поиска введите ключевое слово поиска и нажмите кнопку «Поиск», результаты необходимо загрузить в сетке. Для загрузки и отображения текста «Загрузка ...» требуется несколько секунд, как это в падении div.Ожидание драйвера до исчезновения элемента

<div id="loadmask-1027-msgTextEl" class="x-mask-msg-text">Loading...</div> 

Как я могу подождать, пока это сообщение не исчезнет.

ответ

0

Вы можете создать метод, в котором вы будете идентифицировать, присутствует ли этот элемент. Поместите эту логику в цикл и подождите секунду, прежде чем перейти к следующей итерации. Вероятно, вы можете подождать 10-15 секунд, прежде чем полностью вырваться из цикла. Если элемент исчезнет, ​​он выдает исключение. Вы можете использовать try catch и внутри catch вы можете разбить цикл. Это гарантирует, что код действительно ждет, пока элемент исчезнет, ​​или максимум 10-15 секунд.

+0

Когда когда-либо «загрузка ...» исчезнет только тогда я могу иметь доступ. до этого мне нужно подождать. –

+0

@ СуббараоГаддам Я это понимаю. Используйте метод, чтобы определить, присутствует ли элемент. Затем подождите 1 секунду. Опять же, если элемент присутствует. Если элемент отсутствует, то будет выбрано исключение. Поймайте это исключение, и в пределах блока catch сломайте loop.Hope это помогает. – Vinay

+0

хорошо хорошо .. я попробую. –

3

Webdriver имеет встроенную функцию ожидания, которую нужно просто построить в состоянии ожидания.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
     .withTimeout(30, SECONDS) 
     .pollingEvery(5, SECONDS) 
     .ignoring(NoSuchElementException.class); 

    WebElement foo = wait.until(new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
     return (driver.findElements(By.id("xx")).isEmpty()); 
    } 
    }); 

вам нужно будет заменить By.id («хх») с однако вы определить элемент, который вы ожидаете идти.

+0

Я хотел бы добавить, что размер() == 0 должен быть заменен на isEmpty() – Huy

+1

isEmpty() не возвращает элемент WebElement –

0

Это работает с селеном 2.4.0 Все остальные решения прослушиваются. Метод apply не может возвращать логическое значение, он должен возвращать WebElement. Документация API также неверна. Вот правильный код.

final public static boolean waitForElToBeRemove(WebDriver driver, final By by) { 
    try { 
     driver.manage().timeouts() 
       .implicitlyWait(0, TimeUnit.SECONDS); 

     WebDriverWait wait = new WebDriverWait(UITestBase.driver, 
       DEFAULT_TIMEOUT); 

     boolean present = wait 
       .ignoring(StaleElementReferenceException.class) 
       .ignoring(NoSuchElementException.class) 
       .until(ExpectedConditions.invisibilityOfElementLocated(by)); 

     return present; 
    } catch (Exception e) { 
     return false; 
    } finally { 
     driver.manage().timeouts() 
       .implicitlyWait(DEFAULT_TIMEOUT, TimeUnit.SECONDS); 
    } 
} 
+0

Я фактически поддержал ваш ответ, потому что он является правильным. Проблема с ExpectedConditions.invisibilityOfElementLocated заключается в том, что она внутренне использует неявное ожидание, а не ожидание, которое ее создало, поэтому, несмотря на то, что мы с надежным ожиданием, если мы вызываем invisibilityOfElementLocated, мы будем вынуждены ждать неявного ожидания, который глобально настроен на водитель. Поэтому ваше решение, хотя и не полностью, определенно не заслуживает ненависти, которое оно получило. –

+0

lol, я на самом деле недавно заменил это поиском JavaScript внутри конечного автомата. Это работает намного быстрее и работает все время. Я обнаружил, что все эти ответы .. включая мои .. не работают хорошо все время. Selenium не любит эти проверки и сообщает ненужное количество бессмысленных журналов о том, как он еще не найден. –

+0

Да, мы также выполняем поиск по js, но мой вопрос - это ваше сообщение, которое дает правильное решение (хотя и подвержено проблемам с потоками), в то время как все остальные не смогли повлиять на проблему. –

0

Другой подход в Java, без «ждать» -методы Селен, если текущий код примеры не являются подходящими решениями к вам. Я использую WebDriver с JUnit:

public void waitForElementToDisappear() throws InterruptedException{ 
//try for 5 seconds 
for(int i=0;i<=5;++i){ 
if(driver.findElements(By.xpath(<elementExpectToDisappear>)).isEmpty()){ 
//here your code, if element finally disappeared 
break; 
}else{ 
Thread.sleep(1000); 
} 
if(i==5) 
fail("element not disappeared within 5 seconds"); 
} 
} 
Смежные вопросы