Элемент myElement недоступен для клика в точке (x, y)... Другой элемент получит щелчок
Я пытаюсь выполнить несколько тестов, используя Katalon Studio на основе Selenium. В одном из моих тестов мне приходится писать внутри текстовой области. Проблема в том, что я получаю следующую ошибку:
...Element MyElement is not clickable at point (x, y)... Other element would receive the click...
На самом деле мой элемент находится внутри какого-то другого diva, который может его скрыть, но как я могу заставить событие click попасть в мою текстовую область?
Переведено автоматически
Ответ 1
Element ... is not clickable at point (x, y). Other element would receive the click"
может быть вызвано различными факторами. Вы можете устранить их с помощью любой из следующих процедур:
- Элемент не щелкается из-за присутствия вызовов JavaScript или AJAX
Попробуйте использовать Actions
класс:
WebElement element = driver.findElement(By.id("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
- Элемент не щелкается, поскольку его нет в области просмотра
Попробуйте использовать JavascriptExecutor
, чтобы переместить элемент в область просмотра:
JavascriptExecutor jse1 = (JavascriptExecutor)driver;
jse1.executeScript("scroll(250, 0)"); // if the element is on top.
jse1.executeScript("scroll(0, 250)"); // if the element is at bottom.
Или
WebElement myelement = driver.findElement(By.id("id1"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
- Страница обновляется до того, как элемент станет доступным для клика.
В этом случае вызовет некоторые wait
.
- Элемент присутствует в DOM, но не доступен для клика.
В этом случае добавьте некоторые ExplicitWait
, чтобы элемент был интерактивным.
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
- Элемент присутствует, но имеет временное наложение.
В этом случае вызовите ExplicitWait
с ExpectedConditions
значением invisibilityOfElementLocated
, чтобы наложение было невидимым.
WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
- Элемент присутствует, но имеет постоянное наложение.
Используйте JavascriptExecutor
для отправки щелчка непосредственно по элементу.
WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
Ответ 2
Я полагаю, вы уже проверили, что здесь не перекрывается какой-либо другой компонент (прозрачная реклама-iframes или какой-либо другой компонент DOM => довольно часто видели такие вещи в элементах ввода / текстового поля) и, когда вручную (медленно) пошагово ваш код работает без сбоев, тогда вызовы ajax могут вызвать такое поведение.
Чтобы избежать thread.sleep, попробуйте использовать EventFiringWebDriver и зарегистрировать для него дескриптор. (В зависимости от технического уровня вашего приложения, вы можете использовать его для Angular, jQuery или wicket в обработчике, что требует разных реализаций) (Кстати: этот подход также много раз помогал мне избавиться от "StaleElementException")
смотрите: org.openqa.selenium.support.events.EventFiringWebDriver org.openqa.selenium.support.events.WebDriverEventListener
driveme = new ChromeDriver();
driver = new EventFiringWebDriver(driveme);
ActivityCapture handle=new ActivityCapture();
driver.register(handle);
=> ActivityCapture реализует WebDriverEventListener
например, JavascriptExecutor для обработки вызовов Ajax в wicket / dojo techstack
@Override
public void beforeClickOn(WebElement arg0, WebDriver event1) {
try {
System.out.println("After click "+arg0.toString());
//System.out.println("Start afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
JavascriptExecutor executor = (JavascriptExecutor) event1;
StringBuffer javaScript = new StringBuffer();
javaScript.append("for (var c in Wicket.channelManager.channels) {");
javaScript.append(" if (Wicket.channelManager.channels[c].busy) {");
javaScript.append(" return true;");
javaScript.append(" }");
;
;
;
javaScript.append("}");
javaScript.append("return false;");
//Boolean result = (Boolean) executor.executeScript(javaScript.toString());
WebDriverWait wait = new WebDriverWait(event1, 20);
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return !(Boolean) executor.executeScript(javaScript.toString());
}
});
//System.out.println("End afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
} catch (Exception ex) {
//ex.printStackTrace();
}
}
Ответ 3
Как сказал @DebanjanB, ваша кнопка (или другой элемент) может быть временно закрыта другим элементом, но вы можете подождать и щелкнуть по ней, даже если вы не знаете, какой элемент закрывает кнопку.
Для этого вы можете определить свое собственное ожидаемое условие с помощью действия click:
public class SuccessfulClick implements ExpectedCondition<Boolean> {
private WebElement element;
public SuccessfulClick(WebElement element) { //WebElement element
this.element = element;
}
@Override
public Boolean apply(WebDriver driver) {
try {
element.click();
return true;
} catch (ElementClickInterceptedException | StaleElementReferenceException | NoSuchElementException e) {
return false;
}
}
}
и затем использует это:
WebDriverWait wait10 = new WebDriverWait(driver, 10);
wait10.until(elementToBeClickable(btn));
wait10.until(new SuccessfulClick(btn));
Ответ 4
Попробуйте Thread.Sleep()
Неявный поток.Sleep()
На самом деле это не особенность Selenium WebDriver, хотя это обычная функция в большинстве языков программирования. Но все это не имеет значения.
Нитки.Sleep() делает именно то, что вы думаете, он переводит поток в спящий режим. Итак, когда ваша программа запускается, в большинстве ваших случаев в этой программе будут какие-то автоматические проверки, они выполняются в потоке. Итак, когда мы вызываем Thread.Sleep мы инструктируем нашу программу абсолютно ничего не делать в течение определенного периода времени, просто спать. Не имеет значения, что делает наше тестируемое приложение, нам все равно, нашим проверкам пора спать!
Удручающе, однако довольно часто можно увидеть несколько экземпляров Thread .Sleep() в фреймворках проверки графического интерфейса Selenium WebDriver. Что обычно происходит, так это сбой скрипта или спорадический сбой, и кто-то запускает его локально и понимает, что идет гонка, которую иногда WedDriver проигрывает. Возможно, загрузка приложения иногда занимает больше времени, возможно, когда у него больше данных, поэтому, чтобы исправить это, они просят WebDriver вздремнуть, чтобы убедиться, что приложение загружено до продолжения проверки.
Thread.sleep(5000);
Указанное значение указано в миллисекундах, поэтому этот код приостановит проверку на 5 секунд.