появляется всплывающее сообщ. о результате действия
моя задача проверить это сообщ
выглядит просто, но на практике ситуация немного печальнее.
кликаю save
сайт выдает сообщ
сайт закрывает это сообщ
тут драйвер приходить искать это сообщ (почему с опозданием не знаю, в коде дополнительных ожидании нет, после клика на веб элемент, сразу начинается ожидание сообщ)
Вопрос: Как можно решить эту проблему?
что пришло мне в голову:
запустить дополнительный поток, чья задача только поймать то, что надо. Как я это вижу перед тем как кликнуть сохранить, запускаю этот самый поток, он отдельно от основного начинает ждать это сообщ. основной поток кликает сейв. Как бы командная работа)))
но на практике…
я пробовал new Thread(new Runnable)… тут почему то запускается новый браузер
Сначала вам нужно понять каким образом появляется всплывающее сообщение:
я подозреваю что это происходит посредством js и в DOMе это никак не отображается, поэтому драйвер и не может его найти.
Опишите как вы его ищете.
ничего не будет, вариант что сообщ пропадает из за драйвера исключаем, тут я на 90 % уверен что драйвер начинает искать после того как сообщ ушло (он выскакивает на 2-3 сек)
система сохраняет какие то данные, в процессе этого появляется что то типа спинера который показывает ход сохранения(лог\сообщение: не важно)
в этот момент страница перезагружается
вы пытаетесь найти сообщение
?
И если я все правильно понял то сообщение показывается только в тот момент когда идет сохранение данных, и в этот же момент обновляется страница
вебДрайвер же вступает в работу только тогда когда страница полностью отрендерится а в этот момент спинер уже спрятался. Может лучше посмотреть в то место куда эти данные сохраняются ?(база, логи, …)
Если у ваша проблема соответствует описанию @ramonmenezes, то можно попробовать соорудить костыль используя pageLoadTimeout.
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.MILLISECONDS);
try{
save.click();
} catch (TimeoutException tex) {
// ищем сообщение
}
// не забываем вернуть pageLoadTimeout в исходное положение :)
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;
}
};
}