Веб-драйвер селену та Java. Елемент не можна натискати в точці (x, y). Інший елемент отримає клацання


91

Я використовував явні очікування і маю попередження:

org.openqa.selenium.WebDriverException: Елемент не можна натискати в точці (36, 72). Інший елемент отримає клік: ... Тривалість або час очікування команди: 393 мілісекунди

Якщо я використовую, Thread.sleep(2000)я не отримую жодних попереджень.

@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    driver.findElement(By.id("navigationPageButton")).click();

    try {
       wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
    } catch (Exception e) {
        System.out.println("Oh");
    }
    driver.findElement(By.cssSelector(btnMenu)).click();
    Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}

Чи використовуєте ви Chrome версії 61+?
demouser123

@ demouser123 я використовую Firefox 47.0.1 та seleniumWebDriver 2.51.0
Марія

@Maria У якому рядку ви отримуєте помилку? Дякую
DebanjanB

@DebanjanB У рядку: driver.findElement (By.id ("navigationPageButton")). Click ();
Марія

Ця помилка означає, що є інший елемент, що накладає цільовий елемент (фіксований / абсолютний позиціонований накладення) або z-індекс занадто низький. Це може бути спричинено ефектами наведення при використанні переходів (повільніший за мінімальний тайм-аут, в даному випадку 393 мс). вам слід почекати, поки #navigationPageButtonвін стане видимим (або elementToBeClickable()для цього елемента також можна натиснути ) або перевірити, чи виконуються всі передумови, щоб кнопку можна було натиснути.
try-catch-нарешті

Відповіді:


192

WebDriverException: Елемент не можна натискати в точці (x, y)

Це типовий org.openqa.selenium.WebDriverException, який розширює java.lang.RuntimeException .

Поля цього винятку:

  • BASE_SUPPORT_URL :protected static final java.lang.String BASE_SUPPORT_URL
  • DRIVER_INFO :public static final java.lang.String DRIVER_INFO
  • SESSION_ID :public static final java.lang.String SESSION_ID

Про ваш індивідуальний випадок помилка говорить все:

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

З вашого блоку коду видно, що ви визначили waitяк, WebDriverWait wait = new WebDriverWait(driver, 10);але ви викликаєте click()метод на елементі до того, як він ExplicitWaitувійде в гру, як until(ExpectedConditions.elementToBeClickable).

Рішення

Помилка Element is not clickable at point (x, y)може виникати внаслідок різних факторів. Ви можете звернутися до них за допомогою будь-якої з наступних процедур:

1. Елемент не натискається через наявні виклики JavaScript або AJAX

Спробуйте скористатися Actionsкласом:

WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();

2. Елемент не натискається, оскільки він не знаходиться у вікні перегляду

Спробуйте використати JavascriptExecutorдля введення елемента в область перегляду:

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3. Сторінка оновлюється до того, як елемент стане інтерактивним.

У цьому випадку індукуйте ExplicitWait, тобто WebDriverWait, як зазначено у пункті 4.

4. Елемент присутній у DOM, але його не можна натиснути.

У цьому випадку індукуйте ExplicitWait із ExpectedConditionsвстановленим значенням elementToBeClickableдля того, щоб елемент був інтерактивним:

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5. Елемент присутній, але має тимчасове накладання.

В цьому випадку, індукують ExplicitWaitз ExpectedConditionsнабором до invisibilityOfElementLocatedдля накладення , щоб бути невидимим.

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6. Елемент присутній, але має постійне накладання.

Використовуйте JavascriptExecutorдля надсилання клацання безпосередньо на елемент.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);

1
До # 6 / # 2 вище: Метод .ExecuteScript тепер доступний із веб-драйвера, а не з JavascriptExecutor. Дякуємо за добре написану відповідь!
Таброк

6
Ви охопили багато можливостей, коли лише 5 та 6 є правильним способом усунення згаданої помилки. Перші чотири видають різні помилки, для яких рішення, яке ви дали, не буде працювати. Для прикладу точка 3 - насправді проблема застарілого елемента, яка не спрацює, навіть незважаючи на те, як довго ви чекаєте з методом elementToBeClickble. З цим слід поводитися по-іншому.
Раджагопалан

6 насправді це не правильно; хак, щоб обійти проблему, 5 буде правильним, якщо використовується правильний очікуваний стан. 4 виглядає як єдина правильна відповідь.
Ardesco

1
Важливо зазначити, що коли ми імітуємо дії користувача, може бути дуже небажано використовувати javascript для клацання на елементі, який взагалі не можна натиснути (№6). Кінцевий користувач ніколи цього не робив, він просто прокручував би до елемента, щоб перенести його у область перегляду, або відхиляв будь-яке накладання (якщо сторінка це дозволило) для взаємодії з ним.
p_champ

17

Якщо вам потрібно використовувати його разом з Javascript

Ми можемо використовувати аргументи [0] .click () для імітації роботи кліку.

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);

Працює! Я не уявляю, як це працює, але в іншому випадку він клацає на шарі накладання (очікування закриття накладання "invisibilityOfElementLocated" займає близько 30 секунд).
Fisk

Чи можете ви, будь ласка, написати повне пояснення, оскільки я пишу на Java, і це не звична війна, чи можете ви надати повний потік?
Бастіан,

4

Я зіткнувся з цією помилкою, намагаючись натиснути якийсь елемент (або його накладання, мені було все одно), а інші відповіді мені не працювали. Я виправив це за допомогою elementFromPointAPI DOM, щоб знайти елемент, на який замість цього хотів натиснути Селен:

element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
    "return document.elementFromPoint(arguments[0], arguments[1]);",
    loc['x'],
    loc['y'])
element_to_click.click()

У мене також були ситуації, коли елемент рухався , наприклад, тому що елемент над ним на сторінці виконував анімоване розгортання або згортання. У цьому випадку цей клас «Очікуваний стан» допоміг. Ви надаєте йому анімовані елементи , а не ті, які ви хочете натиснути. Ця версія працює лише для анімації jQuery.

class elements_not_to_be_animated(object):
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try:
            elements = EC._find_elements(driver, self.locator)
            # :animated is an artificial jQuery selector for things that are
            # currently animated by jQuery.
            return driver.execute_script(
                'return !jQuery(arguments[0]).filter(":animated").length;',
                elements)
        except StaleElementReferenceException:
            return False

2

Ви можете спробувати

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();

Це мені не допомагає.
Maria

Так: org.openqa.selenium.WebDriverException: Елемент не можна натискати в точці (36, 72). Інший елемент отримає клік: <div tabindex = "0" class = "waiter-ui-lock"> </div> Тривалість або час очікування: 70 мілісекунд
Марія

1
спробуйте наступнеWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc

Це теж не допомагає. У мене є два винятки і один AssertionError, а наступна помилка "Елемент не можна натискати в точці"
Марія

1
Якщо я використовую Thread.Sleep, тоді все працює. Але я використовую Wait all fail.
Марія

2

Прокрутка сторінки до найближчого пункту, згаданого у винятку, зробила для мене фокус. Нижче наведено фрагмент коду:

$wd_host = 'http://localhost:4444/wd/hub';
$capabilities =
    [
        \WebDriverCapabilityType::BROWSER_NAME => 'chrome',
        \WebDriverCapabilityType::PROXY => [
            'proxyType' => 'manual',
            'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'noProxy' =>  PROXY_EXCEPTION // to run locally
        ],
    ];
$webDriver = \RemoteWebDriver::create($wd_host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels 
$webDriver->executeScript("window.scrollTo(0, 70);");

ПРИМІТКА. Я використовую веб-драйвер Facebook php


0

Найкраще рішення - замінити функціональність клацання:

public void _click(WebElement element){
    boolean flag = false;
    while(true) {
        try{
            element.click();
            flag=true;
        }
        catch (Exception e){
            flag = false;
        }
        if(flag)
        {
            try{
                element.click();
            }
            catch (Exception e){
                System.out.printf("Element: " +element+ " has beed clicked, Selenium exception triggered: " + e.getMessage());
            }
            break;
        }
    }
}

0

У C # у мене була проблема з перевіркою RadioButton, і це працювало для мене:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);

0

Можна спробувати з наведеним нижче кодом

 WebDriverWait wait = new WebDriverWait(driver, 30);

Передача іншого елемента отримає клік :<a class="navbar-brand" href="#"></a>

    boolean invisiable = wait.until(ExpectedConditions
            .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));

Передайте ідентифікатор кнопки, що натискається, як показано нижче

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.