Отладка Ошибка "Элемент не кликается в точке"
Я вижу это только в Chrome.
Полное сообщение об ошибке:
"org.openqa.selenium.WebDriverException: элемент не может быть нажат в точке (411, 675). Другой элемент получит клик:..."
Элемент, который получит "щелчок", находится в стороне рассматриваемого элемента, а не поверх него, а не перекрывает его, а не перемещается по странице.
Я попытался добавить смещение, но это тоже не работает. Элемент отображается в отображаемом окне без необходимости прокрутки.
Ответы
Ответ 1
Это вызвано следующими тремя типами:
1. Элемент невидим, чтобы щелкнуть.
Используйте Действия или JavascriptExecutor, чтобы сделать его нажатием.
По действиям:
WebElement element = driver.findElement(By("element_path"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
От JavascriptExecutor:
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); // if the element is on top.
jse.executeScript("scroll(0, 250)"); // if the element is on bottom.
или
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView()", Webelement);
Затем щелкните элемент.
2. Страница обновляется до того, как щелкнет элемент.
Для этого заставьте страницу ждать несколько секунд.
3. Элемент доступен по клику, но на нем есть прядильщик/наложение
Нижеприведенный код будет ждать, пока оверлей не упадет
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
Затем щелкните элемент.
Ответ 2
Вы также можете использовать JavaScript-клик и прокрутка не требуется.
IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Ответ 3
Кажется, для этого есть ошибка в chromedriver (проблема в том, что он помечен как не исправленный) → GitHub Link
(возможно, наградить спонсоров FreedomSponsors?)
В комментарии № 27 предлагается обходной путь. Может быть, это будет работать для вас.
Ответ 4
У меня была такая же проблема, я пробовал все предлагаемые решения, но они не работали для меня.
в конце концов я использовал это:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));
Надеюсь, что это поможет
Ответ 5
Я видел это в ситуации, когда окно Chrome, открытое селеном, было слишком маленьким. Элемент, который нужно щелкнуть, был вне области просмотра, и поэтому он терпел неудачу.
Звучит логично... реальному пользователю придется либо изменить размер окна, либо прокрутить, чтобы можно было увидеть элемент и фактически щелкнуть по нему.
После инструктирования драйвера селена установить размер окна соответствующим образом, эти вопросы ушли за меня. API-интерфейс webdriver описывается здесь.
Ответ 6
Ничего себе, здесь много ответов и много хороших.
Надеюсь, я добавлю кое-что из этого опыта.
Ну, ребята, в моем случае было время наложения печенья, скрывающее элемент время от времени.
Прокрутка к элементу также работает; но по моему скромному мнению (для моего случая, а не для панацеи для всех) самым простым решением является просто полноэкранный режим (я запускал свои скрипты на 3/4 экрана)! Итак, идем:
driver.manage().window().maximize();
Надеюсь, что это поможет!
Ответ 7
рубин/Watir-WebDriver/хром
Я использую следующий трюк и кажется, что он работает:
#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"
# click myelement
myelement.when_present.fire_event("click")
Ответ 8
Я тоже борюсь с этой проблемой. Код отлично работает в FF, не работает в Chrome. То, что я пытался сделать, это щелкнуть галочку - если это не было видно, я бы выделил ее, чтобы просмотреть, а затем щелкнуть. Даже прокрутка в режиме просмотра работает в Chrome, только нижние несколько пикселей флажка не были видны, поэтому webdriver отказался нажимать на нее.
Мое обходное решение таково:
WebElement element = _sectorPopup.findElement(...);
((Locatable) element).getCoordinates().inViewPort();
try {
element.click();
} catch (Exception e) {
new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
element.click();
}
У Chrome также есть проблемы с sendKeys, иногда необходимо использовать Actions. Очевидно, вам нужно знать, в каком направлении и сколько вам нужно, чтобы ваш пробег мог измениться. Но я предпочитаю это для javascript-хака, поэтому я отправляю его здесь, если кто-то найдет его полезным.
Ответ 9
Получал эту ошибку при запуске тестов без головы с xvfb-run. Они работали безупречно на местном уровне. При использовании chrome версии webdriver/chromedriver/chrome/java и т.д. Идентичны.
Ошибка "не исправить ошибку в chromedriver" - ссылка на GitHub, на которую указал Тони Лампада, предполагает, что это может быть связано с тем, что отображается/не отображается на экране.
Справочное сообщение для xvfb-run показывает следующее:
-s ARGS --server-args=ARGS arguments (other than server number and
"-nolisten tcp") to pass to the Xvfb server
(default: "-screen 0 640x480x8")
Изменение разрешения для xvfb убрало ошибку:
xvfb-run -s "-screen 0 1280x1024x16" ...
Ответ 10
При использовании Транспортера это помогло мне:
var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();
Ответ 11
Сначала попробуйте получить последний драйвер Chrome и проверьте, разрешает ли он проблему.
В моем случае это не решило проблему. Но до сих пор для меня работало следующее решение. Ниже приведен код С#, но вы можете следовать той же логике на своем конкретном языке. Что мы здесь делаем,
Шаг 1: Сосредоточьтесь на элементе, используя объект Selenium Actions,
Шаг 2: Затем сделайте щелчок по элементу
Шаг 3: Если есть исключение, мы запускаем событие javascript "Click" в элементе, выполнив javascript script с помощью метода браузера Selenium "ExecuteScript".
Вы также можете пропустить шаги 1 и 2 и попробовать только шаг 3. Шаг 3 будет работать над этим, но я заметил некоторое странное поведение в одном сценарии, в котором шаг 3, даже если он успешно нажал на элемент, вызвал неожиданное поведение в других частях моего кода после нажатия на элемент.
try
{
//Setup the driver and navigate to the web page...
var driver = new ChromeDriver("folder path to the Chrome driver");
driver.Navigate().GoToUrl("UrlToThePage");
//Find the element...
var element = driver.FindElement(By.Id("elementHtmlId"));
//Step 1
new Actions(driver).MoveToElement(element).Perform();
//Step 2
element.Click();
}
catch (Exception)
{
//Step 3
driver.ExecuteScript("document.getElementById('elementHtmlId').click();");
}
Ответ 12
Я сделал этот метод на основе ответа Тони Лампады. Он работает очень хорошо.
def scroll_to(element)
page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
Ответ 13
Я получал ту же проблему во время запуска selenium script в python. Вот что я использовал для щелчка по элементу:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).click(element).perform()
Ответ 14
Я столкнулся с аналогичной проблемой, я должен проверить два флажка один за другим. Но я получал то же самое выше error.hence, я добавил, подождите между моими шагами для проверки флажков.... его работающий штраф и отлично. Есть шаги: -
When I visit /administrator/user_profiles
And I press xpath link "//*[@id='1']"
Then I should see "Please wait for a moment..."
When I wait for 5 seconds
And I press xpath link "//*[@id='2']"
Then I should see "Please wait for a moment..."
When I visit /administrator/user_profiles_updates
Ответ 15
По-видимому, это результат ошибки "Не исправить ошибку" в двоичном коде Chrome.
Одно из решений, которое сработало для меня (наш пробег May Vary), можно найти в этом обсуждении группы Google, комментарий № 3:
https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc
Соответствующая часть находится здесь:
С тех пор я работал над проблемой, перейдя непосредственно к href родительский якорь span.
driver.Navigate() GoToUrl (driver.FindElement(By.Id(embeddedSpanIdToClick)) FindElement (By.XPath( ".." )) GetAttribute ( "HREF" )..);.
В моем случае я использую Python, поэтому, как только я получил нужный элемент, я просто использовал
driver.get(ViewElm.get_attribute('href'))
Я бы ожидал, что это будет работать, однако, если элемент, который вы пытаетесь нажать, является ссылкой...
Ответ 16
У меня была та же проблема с clj-webdriver (clojure порт Selenium). Я просто перевел предыдущее решение на clojure для удобства. Вы можете вызвать эту функцию, прежде чем делать клик или что-то еще, чтобы избежать этой проблемы.
(defn scrollTo
"Scrolls to the position of the given css selector if found"
[q]
(if (exists? q)
(let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ]
(execute-script jscript))))
Ответ 17
Это может произойти, если элемент изменит позицию, пока драйвер пытается щелкнуть его (я тоже видел это с IE). Водитель сохраняет исходное положение, но к тому времени, когда он фактически нажимает на него, эта позиция больше не указывает на этот элемент. Драйвер FireFox не имеет этой проблемы BTW, по-видимому, он "нажимает" элементы программным способом.
В любом случае, это может произойти, если вы используете анимацию или просто изменяете высоту элементов динамически (например, $("#foo").height(500)
). Вы должны убедиться, что вы просто нажимаете элементы после того, как их высота "улажена". Я закончил с кодом, который выглядит следующим образом (привязки С#):
if (!(driver is FirefoxDriver))
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}
В случае анимации или любого другого фактора, к которому вы не можете легко запросить, вы можете использовать "общий" метод, который ожидает, что элемент будет неподвижным:
var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d =>
{
var e = driver.FindElement(By.Id(someId));
if (e.Location == prevLocation)
{
stationaryCount++;
return stationaryCount == desiredStationarySamples;
}
prevLocation = e.Location;
stationaryCount = 0;
return false;
});
Ответ 18
Я встретил это, потому что обложка диалогового окна загрузки этого элемента. Я просто разрешаю это, добавляя ожидание перед тем, как работать с этим элементом.
try {
Thread.sleep((int) (3000));
} catch (InterruptedException e) {
//
e.printStackTrace();
}
Надеюсь на эту помощь!
Ответ 19
Объяснение сообщения об ошибке:
В сообщении об ошибке просто говорится, что элемент, который вы хотите щелкнуть, присутствует, но он не отображается. Это может быть покрыто чем-то или временным, не видимым.
Может быть много причин, по которым элемент не отображается в момент теста. Проанализируйте свою страницу и найдите подходящее решение для своего дела.
Решение для конкретного случая:
В моем случае эта ошибка возникает, когда всплывающая подсказка элемента экрана, на которую я только что нажал, накладывала элемент, который я хотел щелкнуть дальше. Дефокусировка - это необходимое мне решение.
- Быстрое решение, как расфокусировать, было бы нажатие на какой-либо другой элемент в другой части экрана, который ничего не делает. ничего не происходит после действия клика.
- Правильное решение - вызвать
element.blur()
для элемента, всплывающего всплывающей подсказки, из-за чего всплывающая подсказка исчезнет.
Ответ 20
Причина этой ошибки заключается в том, что элемент, который вы пытаетесь щелкнуть, не находится в области просмотра (область, видимая пользователем) браузера. Таким образом, способ преодолеть это - сначала прокрутить до нужного элемента, а затем выполнить щелчок.
Javascript:
async scrollTo (webElement) {
await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
await this.driver.executeScript('window.scrollBy(0,-150)')
}
Ява:
public void scrollTo (WebElement e) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
js.executeAsyncScript('window.scrollBy(0,-150)')
}
Ответ 21
Re Tony Lâmpada ответ, комментарий # 27 действительно решил проблему для меня, за исключением того, что она предоставила Java-код, и мне нужен Python. Здесь находится функция Python, которая прокручивается до позиции элемента и затем нажимает на нее.
def scroll_to_and_click(xpath):
element = TestUtil.driver.find_element_by_xpath(xpath)
TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
element.click()
Это решило проблему для меня в Chrome 34.0. Это не навредило Firefox 28.0 и IE 11; эти браузеры не подвержены этой проблеме, но прокрутка к позиции элемента, прежде чем щелкнуть по ней, все равно не плохо.
Ответ 22
Возможно, это не очень чистое решение, но оно работает:
try:
el.click()
except WebDriverException as e:
if 'Element is not clickable at point' in e.msg:
self.browser.execute_script(
'$("{sel}").click()'.format(sel=el_selector)
)
else:
raise
Ответ 23
Я получал эту ошибку, потому что я тестировал зависание, а затем мне нужно было щелкнуть ссылку под подсказкой. Решение заключалось в том, чтобы добавить page.find('.sp-logo').hover
до click_link
, чтобы получить всплывающую подсказку.
Ответ 24
Это смешно, все время, когда я смотрел на различные ответы, никто не пробовал очевидного, что, конечно же, я и не знал. Если ваша страница имеет один и тот же идентификатор, используемый несколько раз, как и мой, ( "newButton",) и тот, который вы хотите, не первый, найденный, то вы, скорее всего, получите эту ошибку. Самый простой способ сделать (С#):
var testIt = driver.FindElements(By.Id("newButton"));
Обратите внимание на FindElements, а не на FindElement.
И затем проверьте, сколько результатов вернулось из поиска. Если это второй, вы можете использовать:
testit[1].Click();
Или запустите для повторного использования идентификаторы, чтобы исправить их.
Ответ 25
После тестирования всех упомянутых предложений ничего не получилось. Я сделал этот код. Он работает, но не красив.
public void click(WebElement element) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
element.click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
public void click(String css) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
driver.findElement(By.cssSelector(css)).click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
Ответ 26
Если на странице загружено jQuery
, вы можете выполнить следующую команду javascript:
"$('#" + element_id + "').click()"
Пример использования исполнителя python:
driver.execute_script("$('#%s').click()" % element_id)
Ответ 27
Я делаю своего рода грубую силу кликов, и это работает для меня.
try:
elem.click()
except:
print "failed to click"
size = elem.size
mid_of_y = int(size["height"])/2
stepts_to_do_to_left = int(size["width"])
while stepts_to_do_to_left > 0:
try:
print stepts_to_do_to_left, mid_of_y
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
action.click()
action.perform()
print "DONE CLICK"
break
except:
pass
Ответ 28
У меня была та же проблема, и это было вызвано конфликтом id между div и ссылкой внутри div. Поэтому драйвер нажимал на div вместо ссылки, которую я хотел.
Я изменил id div, и он работал правильно.
До:
<div id="logout"><a id="logout" href="logoutLink">logout</a></div>
После:
<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
Ответ 29
Я столкнулся с этой проблемой и, похоже, был вызван (в моем случае), щелкнув элемент, который выдает div перед щелчком элемента. Я обошел это, обернув мой клик большим блоком catch try catch.
Ответ 30
В Drupal при использовании Selenium:
// Get element.
$element = $this->driver->getElement('xpath=//input');
// Get screen location.
$location = $element->getLocation();
// To make sure that Chrome correctly handles clicking on the elements
// outside of the screen, we must move the cursor to the element location.
$this->driver->moveCursor($location['x'], $location['y']);
// Optionally, set some sleep time (0.5 sec in the example below) if your
// elements are visible after some animation.
time_nanosleep(0, 500000000);
// Click on the element.
$element->click();