Элемент MyElement не кликается в точке (x, y)... Другой элемент получит клик

Я пытаюсь провести некоторые тесты, используя селаниум Katalon Studio. В одном из моих тестов я должен писать внутри текстового поля. Проблема в том, что я получаю следующую ошибку:

...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" Element... is not clickable at point (x, y). Other element would receive the click" может быть вызван разными факторами. Вы можете устранить их одним из следующих способов:

  1. Элемент не нажимается из-за присутствия вызовов JavaScript или AJAX

Попробуйте использовать класс Actions:

WebElement element = driver.findElement(By.id("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
  1. Элемент не получает щелкнул, как это не входит в Viewport

Попробуйте использовать JavascriptExecutor чтобы привести элемент в Viewport:

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); 
  1. Страница обновляется до того, как элемент становится кликабельным.

В этом случае побудите немного wait.

  1. Элемент присутствует в DOM, но не кликабелен.

В этом случае добавьте несколько ExplicitWait чтобы элемент был активным.

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
  1. Элемент присутствует, но имеет временное наложение.

В этом случае вызовите ExplicitWait с ExpectedConditions установленным в invisibilityOfElementLocated чтобы Overlay был невидимым.

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
  1. Элемент присутствует, но имеет постоянное наложение.

Используйте JavascriptExecutor чтобы отправить клик непосредственно на элемент.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);

Ответ 2

Я предполагаю, что вы уже проверили, что здесь нет каких-либо других перекрывающихся компонентов (прозрачные рекламные фреймы или какой-то другой компонент 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

    @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

Попробуйте Thread.Sleep()

Неявный - Thread.Sleep()

Так что на самом деле это не особенность Selenium WebDriver, хотя она распространена в большинстве языков программирования. Но ничего из этого не имеет значения.

Thread.Sleep() делает именно то, что вы думаете, он спит поток. Поэтому, когда ваша программа запускается, в большинстве случаев эта программа будет представлять собой автоматические проверки, они выполняются в потоке. Поэтому, когда мы вызываем Thread.Sleep, мы даем команду нашей программе ничего не делать в течение определенного периода времени, просто спать. Неважно, к чему стремится наше тестируемое приложение, нам все равно, у наших чеков есть время вздремнуть!

К сожалению, довольно часто можно увидеть несколько экземпляров Thread.Sleep() в инфраструктурах проверки графического интерфейса Selenium WebDriver. То, что обычно происходит, - это то, что скрипт будет сбоить или сбоить время от времени, и кто-то запускает его локально и понимает, что есть гонка, которую иногда проигрывает WedDriver. Может случиться так, что приложение иногда загружается дольше, возможно, когда у него больше данных, поэтому, чтобы исправить это, они просят WebDriver вздремнуть, чтобы убедиться, что приложение загружается до продолжения проверки.

Thread.sleep(5000);

Предоставленное значение указывается в миллисекундах, поэтому этот код приостановит проверку на 5 секунд.

Ответ 4

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

Проблема заключалась в том, что я получал исключение в элементе Select и не мог использовать скрипт для щелчка, хотя я пробовал его, он не работал.

Поскольку я хотел выбрать элемент, используя видимый текст (не по значению или номеру опции), я использовал следующий код, который состоит в том, чтобы найти элемент с помощью Xpath [contains (text(), 'text')] и затем изменить HTML, Может быть, это полезно для другого.

self.driver.execute_script(
    "arguments[0].selected=true",
    self.driver.find_element_by_xpath(
        '//*[contains(text(), "%s" )]' % 'your_visible_text'
    ),
)