Элемент доступен для нажатия при запуске в режиме отладки, но при обычном запуске выдает ElementClickInterceptedException - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь сделать веб-автоматизацию. Я определяю всплывающее меню, содержащее кнопку, определенную с помощью xpath или css соответственно как

  • XPath: -> : //button[contains(text(), 'Open Door')

  • CSS: -> : div.device-item.content.view-content > div.detail > div > button.btn.btn-primary.ng-star-inserted

Пока все хорошо, выкидывает

org.openqa.selenium.ElementClickInterceptedException: element click intercepted:

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

Я полагаю, что многие посоветовали бы использовать JavaScriptExecutor подход, нонаша структура имеет проблему возврата любого веб-элемента в виде пользовательского объекта с именем "Элемент" , который не является ни Веб-элементом , ни его подклассом, но расширяет Object и реализует интерфейс под названием IElementпоэтому мы не можем использовать метод JavaScriptExecutor, поскольку для него требуется форма кнопки Web Element, которую мы хотим нажать.

Ответы [ 4 ]

2 голосов
/ 11 ноября 2019

Если он работает в режиме отладки, это означает, что оверлей автоматически исчезает. Вы можете подождать, пока оно исчезнет

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("[id^='device-card']")));

И в любом случае вы можете подождать, пока кнопка будет нажата

button = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(text(), 'Open Door')")));
button.click();
0 голосов
/ 11 ноября 2019
  1. вы можете переместить мышь к этому элементу и затем щелкнуть по нему, даже если я столкнулся с этой проблемой, и это решение решило ее

    Actions clickOnBtn = new Actions(driver);
    clickOnBtn .moveToElement("//button[contains(text(), 'Open Door')").click().build().perform;
    
  2. этопроисходит даже тогда, когда элемент не полностью виден на экране, в этом случае вы можете прокрутить до этого элемента и затем использовать приведенный выше код, как показано ниже

    JavascriptExecutor jse2 = (JavascriptExecutor)driver;
    jse2.executeScript("arguments[0].scrollIntoView()", ele); 
    Actions clickOnBtn = new Actions(driver);
    clickOnBtn .moveToElement("//button[contains(text(), 'Open Door')").click().build().perform;
    
  3. щелкните элемент с помощью javascriptExecutor

    JavascriptExecutor executor = (JavascriptExecutor)driver;
    executor.executeScript("arguments[0].click();", ele);
    
  4. Это даже иногда случается со способом, которым мы выбрали элемент, xpath может быть изменен, мы можем попытаться использовать родительский тег вместо кнопки и попытаться

0 голосов
/ 11 ноября 2019

Вам необходимо позаботиться о нескольких вещах:

  • XPath //button[contains(text(), 'Open Door'): этот xpath может быть дополнительно оптимизирован в любой изформаты:
    • //button[text()='Open Door']
    • //button[contains(., 'Open Door')]
  • CSS : div.device-item.content.view-content > div.detail > div > button.btn.btn-primary.ng-star-inserted выглядит хорошо, но я твердо верюbutton.btn.btn-primary.ng-star-inserted также будет работать.
  • "... Успешно выполняется в режиме отладки ..." : так как клиент браузера получает достаточно времени для настройки динамики веб-страницы, и требуемый WebElement получаетдостаточно времени, чтобы получить интерактив .
  • "... мы тщательно проверяем наличие кнопки и проверяем ее наличие и возможность нажатия ..." : естьмиф как:
    • presenceOfElementLocated(): ожидание проверки наличия элемента в DOM страницы. Это не обязательно означает, что элемент является видимым.
  • где as:
    • elementToBeClickable(): ожидание проверки элементавидимый и включенный, так что вы можете щелкнуть по нему.
  • Поскольку ваш сценарий использования должен вызывать click() для элемента, вам нужно использовать ExpectedConditions как elementToBeClickable().
  • Пример:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("css_element"))).click();
    

Подробное обсуждение можно найти в Какой самый эффективный способ ожиданияэлемент страницы (xpath) для отображения в Selenium Webdriver?

  • Наконец, при использовании клиентов Selenium , грубыхесть методы из JavascriptExecutor , но это должно быть последним средством.

Обновление

Поскольку вы все еще видите ошибку .. .ElementClickInterceptedException: элемент перехватил щелчок ... , вы можете добавить дополнительный шаг, чтобы вызвать WebDriverWait fo невидимость , и вы можете использовать любую из следующих опций:

  • invisibilityOf(WebElement element):

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(overlapping_webelement));
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("css_clickable_element"))).click();
    
  • invisibilityOfElementLocated(By locator):

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("css_overlapping_element")));
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("css_clickable_element"))).click();
    

Вы можете найти соответствующее подробное обсуждение в Метод Selenium invisibilityOf (element), генерирующий NoSuchElementException + WebDriverWait.ignoring (NoSuchElementException.class), не работает

0 голосов
/ 11 ноября 2019

Это будет выглядеть примерно так:

driver.executeScript("document.querySelector('button.btn').click()")

Просто настройте CSS

...