Веб-драйвер не ожидает указанного ограничения по времени при проверке невидимости элемента - PullRequest
1 голос
/ 05 июля 2019

У меня есть этот класс с именем ReusableFunctions, который я использую для реализации методов, которые обычно используются, например, для проверки наличия элементов или невидимости элементов. Я объявил все эти методы как статические и вызываю их, используя имя класса в моем тестовом классе. У меня есть методы, которые ожидают период времени по умолчанию (в моем случае 20 секунд), а также методы, которые принимают значение времени в качестве параметра и ожидают указанный период времени. Проблема заключается в том, что, хотя я передаю параметры в методы ожидания, WebDriver отбрасывает значение параметра и просто ждет времени по умолчанию, равного 20 секундам. У меня есть журналы, напечатанные на моей консоли, и я вижу, что хотя я передал значение параметра времени, равное 10 секунд веб-драйвер отбрасывает это и ждет в течение 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 секунд в качестве его параметра. Но когда я запускаю эти тесты, из моих журналов видно, что в обоих попытках веб-драйвер catch-блоков ждет 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) 

Приведенный выше журнал - это то, что я получаю, когда выполняется оператор wait со значением параметра time. Вы можете видеть, что это говорит 10 секунд, но значение метки времени показывает 20 секунд.

Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 05 июля 2019

Проблема смешивания Implicit и Explicit wait.

Когда вы устанавливаете ImplicitWait так:

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

Затем вы замедляете действия драйвера, такие как findElement, что приводит к дополнительной 10-секундной задержке. Результат смешивания двух разных видов ожиданий непредсказуем.

Удаление implicitWait исправит ваш случай

EDIT:

С Селен документы :

ВНИМАНИЕ: Не смешивайте явные и явные ожидания! Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания 10 секунд и явного ожидания 15 секунд может привести к возникновению тайм-аута через 20 секунд.

0 голосов
/ 05 июля 2019

Похоже, что вы выполняете:

ReusableFunctions.waitTillElementDisappearsWithCustomizedWaitParameter(errorMessageBox,10);

, а затем

ReusableFunctions.waitTillElementDisappears(addBackgroundErrorMessage);

в последовательности.

Оба они ведут логирование log.info("The exception is++++"+e); в блоке перехвата,Какова следующая строка журнала, это Error messages background has disappeared?Если это так, похоже, ваш код работает должным образом.

Возможно, вы захотите настроить строки, в которых регистрируется исключение, чтобы они лучше идентифицировали, какая строка кода фактически регистрируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...