我目前正在使用Selenium创建一些测试用例,我遇到了一个问题。
在我的测试用例中,我试图浏览的网站有一个小表单和一个搜索按钮。填写表单并单击按钮没问题。一旦点击问题就会出现问题。
点击按钮后,会调用此函数:
function muestraEspera(){
document.getElementById("divCargando").style.display = "";
}
基本上,这使得DIV显示包含“加载”图像,因此访问者只看到图像并且无法实际看到网站加载内容直到完成(内容加载了ajax)。
加载内容后,执行此功能:
function escondeEspera(){
document.getElementById("divCargando").style.display = "none";
}
这基本上隐藏了“加载”DIV,因此访问者可以看到结果。
现在,我不能使用SLEEPS,因为加载可能需要更多或更少,因为我需要网站的实际执行时间。有没有办法(使用java-junit4)让selenium等到第二个函数执行后再继续下一步呢?
编辑:我确实使用Selenium RC。要启动驱动程序,我使用:public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "website-url");
selenium.start();
}
最后,由Pavel Janicek给出的完美适合我的解决方案是:
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;
}
}
答案 0 :(得分:4)
您可以使用waitForCondition
如果您使用的是WebDriver,可以尝试使用WebDriverBackedSelenium或FluentWait。
我认为this link会有所帮助。
答案 1 :(得分:3)
你应该试试这个。它一直等到指定的超时。它等待的内容在FluentWait对象中指定。它一直等到布尔值变为true。因此,如果您的元素不再可见,则布尔值为true,方法停止等待。关于这一点的好处是它只会每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 :(得分:2)
**编辑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()
一样。