检查元素的隐身性时,Web驱动程序不等待指定的时间限制

时间:2019-07-05 10:56:29

标签: selenium testing webdriverwait

我有一个名为ReusableFunctions的类,该类用于实现常用的方法,例如检查元素的存在或元素的不可见性。我已将所有这些方法声明为静态方法,并在测试类中使用类名调用它们。我有等待默认时间段(在我的情况下为20秒)的方法,还有将时间值作为参数并等待指定时间段的方法。问题是,即使我将参数传递到等待方法中,WebDriver也会丢弃参数值并仅等待默认时间20秒。我在控制台中打印了日志,即使传递了时间参数值,我仍然看到10秒的Web驱动程序将其丢弃,并等待20秒的时间。请参考下面的代码以更好地理解这一点。

//The reusable class where i implement my wait methods

public class ReusableFunctions extends InitializeBrowser{

static Logger log = Logger.getLogger(ReusableFunctions.class);

//A general wait method that waits for 20 seconds before throwing an 
exception

public static void waitTillElementDisappears(WebElement we){

   WebDriverWait wait=new WebDriverWait(driver, 20);

    wait.until(ExpectedConditions.invisibilityOf(we));
}

//A wait method that takes in a parameter value and waits for the 
specified time limit

public static boolean 
waitTillElementDisappearsWithCustomizedWaitParameter(WebElement we, long 
timeValue){

    WebDriverWait waitTillInvisibility=new WebDriverWait(driver, 
    timeValue);

    waitTillInvisibility.until(ExpectedConditions.invisibilityOf(we));

    if(!we.isDisplayed()){

        return true;

    }else{

        return false;
    }
}
}


//This is how I write validation methods using the above wait 
implementations

public void clickEditInCommunityList(){

    log.info("Clicking edit button in the community list section");

    ExtentTestManager.getTest().log(Status.INFO,"Clicking edit button in 

    the community list section");

    try{

        if(errorMessageBox.isDisplayed()){

   ReusableFunctions.waitTillElementDisappearsWithCustomizedWaitParameter

   (errorMessageBox,10);

        }

    }catch(Exception e){

        log.info("The exception is++++"+e);

        log.info("Error message box not displayed");

    }

    try{

        if(addBackgroundErrorMessage.isDisplayed()){


  ReusableFunctions.waitTillElementDisappears(addBackgroundErrorMessage);
        }

    }catch(Exception e){

        log.info("The exception is++++"+e);

        log.info("Error messages background not displayed");

    }

    communityEditButton.click();

    log.info("Edit button clicked successfully");

    ExtentTestManager.getTest().log(Status.INFO,"Edit button clicked 

    successfully");
    }

从上面的代码中可以看到,一次尝试,catch块我使用了默认的等待功能,它等待20秒,而另一次尝试,catch块我使用了另一个等待功能, 10秒的时间值作为其参数。但是,当我运行这些测试时,从日志中看到的是,在两次try,catch块中,web驱动程序都等待20秒。

Logs below
05-07-2019 **15:39:38** INFO [SNMPPage]: Clicking edit button in the 
community list section
05-07-2019 **15:39:59** INFO [SNMPPage]: The exception 
is++++org.openqa.selenium.TimeoutException: Expected condition failed: 
waiting for invisibility of Proxy element for: DefaultElementLocator 
'By.xpath: //ul[@id='noty_center_layout_container']' (tried for 10 
second(s) with 500 milliseconds interval) 

上面的日志是执行带有time参数值的wait语句时得到的。您会看到它显示10秒,但时间戳记值显示20秒。

任何对此的帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

问题在于混合ImplicitExplicit等待。

当您这样设置ImplicitWait时:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

然后,您减慢诸如findElement之类的驾驶员动作,这会导致额外的10秒延迟。混合两种不同类型的等待的结果是不可预测的。

删除implicitWait将解决您的情况

编辑:

来自Selenium docs

  

警告:请勿混合使用隐式和显式等待!这样做可能导致无法预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,则可能导致20秒后发生超时。

答案 1 :(得分:0)

您似乎在跑步:

ReusableFunctions.waitTillElementDisappearsWithCustomizedWaitParameter(errorMessageBox,10);

然后

ReusableFunctions.waitTillElementDisappears(addBackgroundErrorMessage);

按顺序。

这两者都是在catch块中记录log.info("The exception is++++"+e);。接下来的日志行是Error messages background has disappeared吗?如果是这样,则看来您的代码正在按预期工作。

您可能需要调整记录异常的行,以便它们更好地标识实际记录的代码行。