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
элемента, который вы пытаетесь щелкнуть.
Я все время использовал третий путь с успехом.
Другой
- Сделайте
.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();