Selenium нажимает элемент "успешно", но на самом деле он не нажат
у меня есть метод, который нажимает на кнопку, однако, когда он запускается, selenium возвращает результат, как щелкнул успешно, когда на самом деле кнопка фактически не нажата. Если я запускаю тест несколько раз, иногда, он будет щелкнут, как ожидалось. У меня есть тестовая платформа, установленная как неявное ожидание около 15 секунд, я установил явное ожидание этого элемента и все еще вижу ту же проблему. Когда я делаю <element>.isDisplayed()
этот элемент всегда находили. Я поставил .щелкните в цикле while, чтобы нажмите на него несколько раз, что работает большую часть времени, однако, все еще иногда тест терпит неудачу. Можно ли иметь оператор if, чтобы проверить, действительно ли элемент отображается перед нажатием кнопки?
Я пробовал:
if(!element.isDisplayed){
element.click
}
вот кнопка, с которой у меня возникли проблемы:
<button class="notkoButton listNew">
<div class="l6e iconAdd">New List</div>
</button>
вот мой способ:
public marketing_lists_page navigateToNewListPage() throws Throwable {
try {
int x = 0;
while(x < 5) {
newListBtn.click();
x++;
}
//newListPageHeader.isDisplayed();
} catch (NoSuchElementException e){
logs.errorDetails("Could not navigate to New List Page");
Assert.fail();
}
return this;
}
6 ответов
Кажется, что элемент не включен изначально или не кликабельная. И чтобы ответить на ваш вопрос, Да, есть явное ожидание, которое вы можете использовать и ждать, пока элемент будет кликабельным:
WebDriverWait wait = new WebDriverWait(driver, timeOut);
wait.until(ExpectedConditions.elementToBeClickable(locator));
попробуйте это, Нажмите с помощью javascript и не стесняйтесь, чтобы изменить местоположение для элемента в соответствии с вашим удобством: -
WebElement element= driver.findElement(By.xpath("YOUR XPATH"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);
надеюсь, это поможет вам:)
попробуйте прокрутить до элемента, прежде чем нажать на него. Это в основном происходит при тестировании на chrome. Для прокрутки можно использовать JavaScriptExecutor.
что-то вроде этого:
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollTo(0," + element.getLocation().Y + ")");
вы говорите, что пробовали явное ожидание, но похоже, что то, что вы просите, может быть лучше всего выполнено fluentWait (который является типом явного ожидания):
public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
});
return foo; };;
здесь WebElement будет кнопку нажать кнопку. Классная вещь о FluentWait заключается в том, что сам элемент возвращается, если он найден. Из документации:
реализация интерфейса ожидания, который может иметь свой тайм-аут и интервал опроса, настроенный на муха. Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки условия. Кроме того, пользователь может настроить ожидание для игнорирования определенных типов исключений во время ожидания, таких как NoSuchElementExceptions при поиске элемента на странице.
использовать его просто:
WebElement newListBtn = fluentWait(By.id("button"));
также попробуйте:
Driver.SwitchTo().DefaultContent();
перед щелчком на всякий случай, если это проблема кадра.
селен страдает от отсутствия "динамизма" GUI. Я советую вам отправить обновить страницу после клика.
Скажи мне, что случилось.
я столкнулся с той же проблемой, но только после того, как я обновил свои библиотеки selenium с 2.45 до 2.48.2. Вызов метода "Click" никогда не терпит неудачу, что означает, что элемент всегда находится драйвером, что я думаю это не удается сделать, это нажатие на нужное место может быть. Мой тест будет работать нормально на экране с более высоким разрешением и иногда пройдет (но в основном не из-за проблем с щелчком) на экране с более низким разрешением. Я пробовал много вещей, но в конце концов то, что сработало для меня, было ZOOM.
перед запуск теста я вызываю следующий метод, и метод "click"работает как ожидалось на этом экране с низким разрешением.
public void zoomOut () {
WebElement html = driver.findElement(By.tagName("html"));
html.sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
}