2

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

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

下面的代码包含等待标题标签被加载,它每 2 秒到 12 秒检查一次 h1 标签。

硒代码

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>
4

1 回答 1

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 行为的方式。

于 2013-11-13T09:05:01.683 回答