Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

прошу помочь поймать всплывающее сообщение

webdriver
Теги: #<Tag:0x00007f7b65966b70>

(Yerassyl Turlygazhy) #1

Товарищи, ситуация такая:

  1. кликаю save
  2. появляется всплывающее сообщ. о результате действия
  3. моя задача проверить это сообщ
    выглядит просто, но на практике ситуация немного печальнее.
  4. кликаю save
  5. сайт выдает сообщ
  6. сайт закрывает это сообщ
  7. тут драйвер приходить искать это сообщ (почему с опозданием не знаю, в коде дополнительных ожидании нет, после клика на веб элемент, сразу начинается ожидание сообщ)

Вопрос: Как можно решить эту проблему?

что пришло мне в голову:
запустить дополнительный поток, чья задача только поймать то, что надо. Как я это вижу перед тем как кликнуть сохранить, запускаю этот самый поток, он отдельно от основного начинает ждать это сообщ. основной поток кликает сейв. Как бы командная работа)))
но на практике…

я пробовал new Thread(new Runnable)… тут почему то запускается новый браузер


(Oleksii Ihnatiuk) #2

Сначала вам нужно понять каким образом появляется всплывающее сообщение:
я подозреваю что это происходит посредством js и в DOMе это никак не отображается, поэтому драйвер и не может его найти.
Опишите как вы его ищете.


(Сержан Есенбек) #3
 String getText = $(byText("Загрузка")).waitUntil(visible, 1500).getAttribute("class");
    System.out.println(getText);

попробуй как нибудь так


(Yerassyl Turlygazhy) #4

нет драйвер это видит, просто иногда не успевает его поймать


(Yerassyl Turlygazhy) #5

ваш вариант подходит если б драйвер не дожидался, тут ситуация полностью наоборот


(Сержан Есенбек) #6

что будет с сообщ. если мышкой нажать на него ?


(Yerassyl Turlygazhy) #7

ничего не будет, вариант что сообщ пропадает из за драйвера исключаем, тут я на 90 % уверен что драйвер начинает искать после того как сообщ ушло (он выскакивает на 2-3 сек)


(Oleksii Ihnatiuk) #8

покажите код как вы это реализовали?


(Ramon Menezes) #9

если я правильно понимаю проблему то:

  1. нажимается сейв
  2. система сохраняет какие то данные, в процессе этого появляется что то типа спинера который показывает ход сохранения(лог\сообщение: не важно)
  3. в этот момент страница перезагружается
  4. вы пытаетесь найти сообщение
    ?
    И если я все правильно понял то сообщение показывается только в тот момент когда идет сохранение данных, и в этот же момент обновляется страница
    вебДрайвер же вступает в работу только тогда когда страница полностью отрендерится а в этот момент спинер уже спрятался. Может лучше посмотреть в то место куда эти данные сохраняются ?(база, логи, …)

(Дмитрий Кравчук) #10

Если у ваша проблема соответствует описанию @ramonmenezes, то можно попробовать соорудить костыль используя pageLoadTimeout.

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.MILLISECONDS);
try{
     save.click();
} catch (TimeoutException tex) {
     // ищем сообщение
}
// не забываем вернуть pageLoadTimeout в исходное положение :)

(Al Ba) #11

Нашли решение? Если нет скиньте URL страницы где вплывает сообщение.


(Michael Beider) #12

Here is a basic concept to wait for fast appearance and disappearance of Element. From here you can develop method to get a WebElement and do different assertion on it

	/**
	 * Waits 3 seconds for an element to either disappear or become invisible. Assumes that the element
	 * is already visible, or just about to appear, thus only briefly waits for the element to
	 * appear. Mainly used for spinner elements.
	 */
	public void elementToAppearFastAndDisappear(final By by, WaitUnit ...waitUnit) {
	    
		boolean foundElement = false;
	
	    try {
	    	getDriver().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

	        // Wait for the element to appear
            new WebDriverWait(driver, getWaitLengthFromVarArgs(waitUnit)).until(visibilityOfElementLocated(by));
	        log.debug("The spinner '{}' is visible", by.toString());
	        
	        // We got it! Now wait for it to go away
	        foundElement = true;
	        new WebDriverWait(driver, getWaitLengthFromVarArgs(waitUnit)).until(invisibilityOfElementLocated(by));	
	        log.debug("The spinner '{}' is invisible", by.toString());

	    } catch (TimeoutException e) {
	        /*
	         *  If we we did not find the element at all it means it already disappeared and we're ok.
	         *  If we timed out in waiting for it to disappear, we have a problem and should throw the
	         *  exception.
	         */
	        if (foundElement) {
	            throw new TimeoutException(e);
	        }
	    } finally {
	        // Restore the global Implicit Wait timeout
	    	getDriver().manage().timeouts().implicitlyWait(WaitUnit.DEFAULT.getValue(), TimeUnit.SECONDS);
	    }
	}

public static ExpectedCondition visibilityOfElementLocated(final By locator) {
return new ExpectedCondition() {

        @Override
        public Boolean apply(WebDriver driver) {
            try {
                return findElementFast(locator, driver).isDisplayed();
            } catch (NoSuchElementException e) {
                /*
                 *  Returns true because the element is not present in DOM. The
                 *  try block checks if the element is present but is invisible.
                 */
                return true;
            } catch (StaleElementReferenceException e) {
                /*
                 *  Returns true because stale element reference implies that element
                 *  is no longer visible.
                 */
                return true;
            }
        }

        @Override
        public String toString() {
            return "element to no longer be visible: " + locator;
        }
    };
}

public static ExpectedCondition invisibilityOfElementLocated(final By locator) {
return new ExpectedCondition() {

        @Override
        public Boolean apply(WebDriver driver) {
            try {
                return !(findElementFast(locator, driver).isDisplayed());
            } catch (NoSuchElementException e) {
                /*
                 *  Returns true because the element is not present in DOM. The
                 *  try block checks if the element is present but is invisible.
                 */
                return true;
            } catch (StaleElementReferenceException e) {
                /*
                 *  Returns true because stale element reference implies that element
                 *  is no longer visible.
                 */
                return true;
            }
        }

        @Override
        public String toString() {
            return "element to no longer be visible: " + locator;
        }
    };
}

(Nikita) #13

по мне, не самый приоритетный кейс, у вас действительно покрыта вся бизнес логика?