Selenium Java дескриптор объекта (предупреждение диалоговое окно) исключение без задержки. (непредсказуемое всплывающее окно Java)

Цель: всплывающее предупреждение. показывается или нет, я хочу, чтобы это продолжалось. если он показывается, установите флажок и нажмите "Продолжить". если нет, игнорируйте.

Блокировщик: если отображается предупреждение, оно будет обрабатывать действие и диалог будет закрыт. но когда это не так, селен висит там без условия обработки, когда он не показан.

фон: я раньше использовал UFT, возможно, моя логика могла быть неправильной. всплывающее окно - это оповещение приложения (не системы), поэтому предполагается, что "switch to(),accept()/dismiss() не будут работать. Я добавлю дескриптор сразу после входа в систему и в методе входа ниже".

Селен рамки фона. : мы используем селен Maven Framework, спокойствие BDD. Объект устанавливается в начале страницы. и serenity.properties обрабатывают время ожидания по умолчанию и так далее.

Всплывающие объекты (если они появляются):

@FindBy(xpath = "//input[@id='notification-ack']")
private WebElement PcoNoticeChbx; //this is a check box, needs to be checked
@FindBy(xpath = "//button[contains(.,'Continue')]")
private WebElement PcoNoticeContinueBtn;//button to close the alert

* Метод входа *

 public void loginIntoExtApplication(String baseURL, String loginURL, String uId, String pwd, String extAppEnv)throws Exception {
            gotoExtLoginPage(baseURL, loginURL);         
            enterLoginCredential(uId, pwd);
     openAt("https://" + extAppEnv + ".programportaltest.hrsa.gov/sdms-
    extranet/index.xhtml");

Мои подходы:

// 1.

     if (PcoNoticeChbx!=null) {
            PcoNoticeChbx.click();
            PcoNoticeContinueBtn.click();
        } else {
            System.out.println("Dialog didn't display, no need any action");
        }

// 2. повесил тут после входа в систему действия.

     if(!getDriver().findElements(By.xpath("//*[@id='submit']")).isEmpty()){
                 PcoNoticeChbx.click();
                 PcoNoticeContinueBtn.click();
            } 
             else {  
                System.out.println("Dialog didn't display, no need any action");
            } 

// 3. добавлено, чтобы смотреть не работает, он показывает в ожидании, ниже код тоже не удалось. я запускал свой Maven в Junit как режим отладки. раньше работало нормально. но элементы часов всегда показывают (ожидающие)..

     boolean isPresent = getDriver().findElements(By.id("noticebox")).size() >0  
      System.out.println("the diaolog exist=  " + isPresent);

// 4. даже попробовал метод try catch.

try{    
             PcoNoticeChbx.click();
             PcoNoticeContinueBtn.click(); 
         }catch (Exception e){ 
            // Printing logs for my report 
             Log.error("Report Category button element is not found."); 

            // After doing my work, now i want to stop my test case 
             throw(e); 
         } 
    return;
     }  

// 5. попробовал список вебебелемцев:

List temp = webdriver.findElements (org.openqa.selenium.By.id ("notebox"));

    if (temp.Count > 0 && temp[0].Displayed) {
                    // script to execute if element is found
                } else {
                    //  continue the test
         }  

// 6. и ниже

if (!WebDriver.findElements(By.xpath("//*[@id='submit']")).isEmpty()==true);


        {
                //handle the dialog 
            }  
            else{   
                //continue 
            }

// 7.пробовал с логическим значением, но он также зависает на первых шагах

boolean Nbox = PcoNoticeChbx.isDisplayed(); {




    if (Nbox==false)
               {
             System.out.println("Dialog didn't display, no need any action");
               } 
             else if (Nbox==true) {
             PcoNoticeChbx.click() ;
             PcoNoticeContinueBtn.click();  
             }

2 ответа

Решение найдено для моего случая.

это может быть очень легко. но мне нужно несколько раз, чтобы исследовать. надеюсь, это поможет вам.

после использования многих методов, для этого javascripts подтверждение оповещения. Я использовал метод ниже. вся помощь.CurrentlyVisible() метод. потому что этот, и я думаю, только этот даст вам результат, даже если элемент не существует или ноль..

if (element(NoticeContinueBtn).**isCurrentlyVisible**()==true) {

    PcoNoticeChbx.click();
    PcoNoticeContinueBtn.click();
    //else just continue
}

Если это как всплывающие окна, с которыми я имел дело, они работают так:

  1. Клиент заходит на сайт и сайт проверяет наличие куки. Если этот файл cookie существует, всплывающее окно никогда не запускается (идеальное состояние). Если этот файл cookie НЕ существует (обычное состояние), по истечении заданного периода времени появляется всплывающее окно.
  2. Клиент закрывает всплывающее окно, и файл cookie создается со сроком действия.
  3. По истечении этого времени срок действия файла cookie истекает, и всплывающее окно снова запускается.

Вам нужно провести некоторое исследование и найти cookie, который создается после закрытия всплывающего окна. Очистите кеш, перейдите на сайт и запишите все существующие файлы cookie. Дождитесь всплывающего окна и отклоните его. Теперь найдите только что созданный файл cookie и проверьте его. Это печенье, которое вам нужно создать. Существует множество учебных пособий по созданию файлов cookie. Это довольно просто.

Как только вы научитесь создавать cookie, вы добавите его в свой скрипт, как описано ниже:

  1. Перейдите на страницу в домене, который, как вы знаете, не существует, например, www.domain.com/some404page. Мы делаем это, потому что это не вызовет всплывающий обратный отсчет, и нам нужно быть в домене, чтобы создать cookie.
  2. Создать куки
  3. Сделай свой нормальный тест

Нет больше всплывающих окон.

Другие вопросы по тегам