WebDriver - элемент не доступен для Chrome

У меня есть следующая проблема. Я запускаю тест на Firefox и Chrome. В Firefox тестовый запуск выполняется правильно, но в Chrome SauceLabs выдается сообщение:

unknown error: Element is not clickable at point (717, 657). Other
element would receive the click: <div class="col-md-9 col-sm-12"
style="margin-top:8px;">...</div> (Session info: chrome=36.0.1985.125)
(Driver info: chromedriver=2.10.267521,platform=Windows NT 6.3 x86_64)

Я выбираю элемент с помощью уникального селектора css в обоих тестах следующим образом:

driver.FindElement(By.CssSelector("button.btn-xs:nth-child(1)")).Click();

Любые идеи, что здесь не так?

Ответ 1

Я предполагаю, что у вас есть нужный элемент, то есть XPath правильный. Вот несколько вариантов:

  • Попробуйте нажать parent element вместо этого.
  • Попробуйте Submit() вместо .Click()
  • Попробуйте выполнить JavaScript, который будет выполнен в событии OnClick элемента, который вы пытаетесь щелкнуть.

Я все время использовал третий путь с успехом.

Другой

  1. Сделайте .SendKeys(Keys.Enter) для этого элемента (или клавишу пробела)

Ответ 2

Поскольку вы также отметили вопрос как Google-Chrome, я полагаю, что это происходит в основном с ChromeDriver. У меня были те же проблемы с одним из моих предыдущих проектов (Asp.Net MVC). Я обнаружил, что когда некоторые элементы не отображаются для этого драйвера, если они не находятся в screen_visible_area. Пожалуйста, заметьте, что они загружены (HTML, CSS3, JS и т.д.) Правильно.

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

unknown error: Element is not clickable at point (..., ...) 

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

Просто, чтобы быть полным ответом - у меня были те же проблемы с IEDriver. Моя реализация заключалась в том, чтобы использовать Browser scroll down/up options и просто "отправить экран", где находится проблематичный элемент.

Простой код JSExecutor, который вы можете использовать:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(110,350)", "");

или

jse.executeScript("scroll(0, 250);");

или

driver.executeScript("window.scrollBy(110,350)", "");

Другие связанные с темой полезные ресурсы здесь.

Обновление

Когда дело доходит до .sendKeys(), я также использовал возможности просмотра браузера. Все, что вам нужно сделать, это просто подсчитать, сколько TAB нажимает на вашу тестовую потребность, чтобы перейти к целевому веб-элементу. Затем просто позвоните .click().

Попробуйте этот простой код:

element.sendKeys(Keys.TAB);

или

element.sendKeys("\t")

или

Actions builder = new Actions(driver);
builder.keyDown(Keys.TAB).perform()

Ответ 3

Я понимаю, что это очень старый вопрос, но он появился при поиске почти идентичной проблемы в настоящее время. После попытки многих исправлений, описанных здесь, и получения новых исключений из-за моей проблемы (в основном, устаревших элементов и тайм-аутов HTTP-запросов), я наткнулся на эту проблему на Selenium GitHub.

Как описано в сообщении, Chrome вышел за рамки возможностей моей версии chromedriver.exe - у моего v2.30-драйвера были проблемы с элементами щелчка из-за изменений в механизме прокрутки Chrome v61. Обновление до последнего файла chromedriver.exe решило все мои проблемы.

tl/dr: убедитесь, что ваша версия хромирования совместима с версией проверяемого Chrome.

Ответ 4

Если вы делаете что-то сложное в своем CSS, Chrome может запутаться (это случилось со мной) и подумайте, что элемент, который вы пытаетесь щелкнуть, покрывается другим элементом, даже если это не так.

Один из способов решения этой проблемы - помочь Chrome правильно понять ситуацию, добавив z-indexes (вам также нужно добавить относительное или абсолютное позиционирование), чтобы однозначно разместить правильный элемент поверх другого.

Ответ 5

Для меня это создало эту команду.

driver.FindElementByXPath("id('gender1')").SendKeys(Keys.Space);

В моем случае я взаимодействовал с радиоуправлением.

Ответ 6

У меня была эта проблема с FF. Эта проблема возникает, когда ваше поле отсутствует в области просмотра. Исключительный способ решить эту проблему - уменьшить масштаб браузера:

TheNotClickableField.SendKeys(Keys.Control + "-" + "-" );

вы можете уменьшить масштаб более или менее в соответствии с размером страницы.

Ответ 7

Я получал сообщение о том, что кнопка входа в систему не реагирует на нажатие в Chrome, даже xpath был верным. просмотрев многие сайты, я пришел к решению - используйте .submit() вместо .click(), и оно отлично работает.

driver.findElement(By.xpath("//button[@id='loginBtn']")).click();
driver.findElement(By.xpath("//button[@id='loginBtn']")).submit();

Ответ 8

I. Если кнопка находится в нижней части страницы, следующий код можно использовать для того, чтобы вы дошли до конца с помощью JavaScript, с которого можно выполнить клик:

(драйвер как IJavaScriptExecutor).ExecuteJavaScript( "window.scrollTo(0, document.body.scrollHeight - 150)" );

То же самое действие можно выполнить с помощью С# с классом Actions, предоставленным Selenium. Это приведет вас к нижней части страницы ----- >

новые действия (драйвер).SendKeys(Keys.End).Perform();

Keys.End можно переключить с помощью Keys.PageDown//Keys.Space

II. Если вы хотите получить точное положение элемента, вы можете:

1.Установите элемент Y location --- > var elementToClick = driver.findElement(By. {Anything} (""));

2. Выполните следующий JS --- > (драйвер как IJavaScriptExecutor).ExecuteScript(string.Format( "window.scrollTo(0, {0})", elementToClickYLocation.Location.Y));

3.Нажмите элемент --- > elementToClick.click();