我有一个名为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秒。
任何对此的帮助将不胜感激。
答案 0 :(得分:3)
问题在于混合Implicit
和Explicit
等待。
当您这样设置ImplicitWait时:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
然后,您减慢诸如findElement
之类的驾驶员动作,这会导致额外的10秒延迟。混合两种不同类型的等待的结果是不可预测的。
删除implicitWait
将解决您的情况
编辑:
警告:请勿混合使用隐式和显式等待!这样做可能导致无法预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,则可能导致20秒后发生超时。
答案 1 :(得分:0)
您似乎在跑步:
ReusableFunctions.waitTillElementDisappearsWithCustomizedWaitParameter(errorMessageBox,10);
然后
ReusableFunctions.waitTillElementDisappears(addBackgroundErrorMessage);
按顺序。
这两者都是在catch块中记录log.info("The exception is++++"+e);
。接下来的日志行是Error messages background has disappeared
吗?如果是这样,则看来您的代码正在按预期工作。
您可能需要调整记录异常的行,以便它们更好地标识实际记录的代码行。