2013-11-13 4 views
2

Я использую раму selenium, где я проверяю на завершение загрузки трех тегов заголовка с id say head1, head2, head3. Общее время ожидания, за которое я хочу подождать убедитесь, что загрузка всех трех тегов заголовка составляет 12 секунд. Загрузка трех тегов заголовка может произойти либо в любое время 1,2,3,4 ... секунды.Проверка наличия элемента в регулярном временном интервале Selenium

Теперь я хочу регулярно проверять каждые 2 секунды до 12 секунд, чтобы проверить, загружены ли все три тега заголовка, чтобы я мог перейти к другой части кода. Я пробовал несколько кодов, но не смог определить точный код, который соответствует моему требованию.

В приведенном ниже коде содержится ожидание заголовка заголовков для загрузки, который проверяет тег h1 каждые 2 секунды до 12 секунд.

Селен Код

WebDriver driver = new FirefoxDriver(); 
driver.get("http://URL.com/Sample.jsp"); 
driver.manage().window().maximize(); 

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

WebElement foo = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("h1"))); 

if((driver.findElement(By.id("h1")).getText()).length() >0) 
    System.out.println("Element Loaded"); 
else 
    System.out.println("Element yet to be Loaded"); 

HTML код

<script type="text/javascript"> 

myFunction(); 

function myFunction() 
{ 
    setTimeout(function(){populateDiv1();},3000); 
    setTimeout(function(){populateDiv2();},6000); 
    setTimeout(function(){populateDiv3();},9000); 
} 

function populateDiv1() 
{ 
    document.getElementById('div1').innerHTML = "<h1 id='head1'>Div1 Loaded</h1>";   
} 

function populateDiv2() 
{ 
    document.getElementById('div2').innerHTML = "<h1 id='head2'>Div2 Loaded</h1>";   
} 

function populateDiv3() 
{ 
    document.getElementById('div3').innerHTML = "<h1 id='head3'>Div3 Loaded</h1>";   
} 
</script> 
</head> 
<body> 
    <div id="div1"> 
    </div> 
    <div id="div2"> 
    </div> 
    <div id="div3"> 
    </div> 
</body> 
+1

Что происходит в приведенном выше коде и как это противоречит тому, что вы хотите? – Seanny123

+0

Извините, что я не могу определить точную функцию и как использовать в соответствии с моими потребностями. Короче, мне нужно проверить наличие элемента в регулярном интервале времени от 2 секунд до 12 секундного таймаут –

+0

Я понимаю вашу проблему, я прошу что происходит в приведенном выше коде. – Seanny123

ответ

3

Хорошо, мне потребовалось некоторое время, чтобы найти решение, но я, что это один должен работать для вашего случая

ExpectedCondition e = new ExpectedCondition<Boolean>() { 
    public Boolean apply(WebDriver driver) { 
     return driver.findElements(By.cssSelector("div[id*='div']")).size() >= 2; 
    } 
}; 

WebDriverWait wait = new FluentWait<WebDriver>(driver) 
        .withTimeout(12, TimeUnit.SECONDS) 
        .pollingEvery(2, TimeUnit.SECONDS) 
        .ignoring(NoSuchElementException.class); 
wait.until(e); 

Вы может, конечно, связать условие с чем угодно, например, найти каждый элемент отдельно, вам просто нужно вернуть boolean. Это, как вы можете создать свой собственный ExpectedConditions, чтобы настроить поведение Seleniums.

+0

Спасибо за ответ. Единственное, что я не понимаю, - это div [id * = 'div']. Не могли бы вы любезно объяснить, что происходит. Еще раз повторите –

+0

Это выберет все элементы, которые id содержит строку 'div' (так, как в вашем примере,' div1', 'div2' и т. д.) –

Смежные вопросы