在常规时间间隔Selenium中检查元素的存在

时间:2013-11-13 05:49:01

标签: java testing selenium selenium-webdriver

我正在使用selenium框架,我正在检查完成三个标题标签的加载,其中id为head1,head2,head3。我要等待的总等待时间,以确保所有三个标题标签的加载是12秒。三个标题标签的加载可以在任何时间发生1,2,3,4 ......秒。

现在我想每隔2秒进行一次定期检查,直到12秒,检查是否所有三个标题标签都已加载,这样我就可以跳转到代码的其他部分了。我尝试了很少的代码,但无法确定符合我要求的确切代码。

以下代码包含等待标题标记加载,每隔2秒检查一次h1标记,直到12秒。

Selenium Code

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 个答案:

答案 0 :(得分: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行为的方法。