Отладка Ошибка "Элемент не кликается в точке"

Я вижу это только в 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();