Selenium Web Driver i Java. Elementu nie można kliknąć w punkcie (x, y). Inny element otrzyma kliknięcie

91

Użyłem jawnego czekania i mam ostrzeżenie:

org.openqa.selenium.WebDriverException: Elementu nie można kliknąć w punkcie (36, 72). Inny element otrzyma kliknięcie: ... Czas trwania lub limit czasu polecenia: 393 milisekundy

Jeśli używam Thread.sleep(2000), nie otrzymuję żadnych ostrzeżeń.

@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);
}
Maria
źródło
Czy używasz Chrome w wersji 61+?
demouser123
@ demouser123 Używam przeglądarki Firefox 47.0.1 i seleniumWebDriver 2.51.0
Maria,
@Maria W którym wierszu pojawia się błąd? Dzięki
DebanjanB
@DebanjanB W wierszu: driver.findElement (By.id ("navigationPageButton")). Click ();
Maria
Ten błąd oznacza, że ​​istnieje inny element nakładający się na element docelowy (nakładka z pozycją stałą / bezwzględną) lub indeks Z jest za niski. Może to być spowodowane efektami najechania kursorem używającymi przejść (wolniej niż minimalny limit czasu, w tym przypadku 393 ms). powinieneś poczekać, #navigationPageButtonaż stanie się widoczny (lub klikalny, używając również elementToBeClickable()dla tego elementu) lub sprawdź, czy wszystkie warunki wstępne są spełnione, aby przycisk był klikalny.
spróbuj złapać wreszcie

Odpowiedzi:

192

WebDriverException: elementu nie można kliknąć w punkcie (x, y)

Jest to typowy wyjątek org.openqa.selenium.WebDriverException, który rozszerza wyjątek java.lang.RuntimeException .

Pola tego wyjątku to:

  • 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

O Twoim indywidualnym przypadku użytkowania, błąd mówi wszystko:

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

Z bloku kodu jasno wynika, że ​​zdefiniowałeś waitas, WebDriverWait wait = new WebDriverWait(driver, 10);ale wywołujesz click()metodę na elemencie, zanim ExplicitWaitwejdzie do gry, jak w until(ExpectedConditions.elementToBeClickable).

Rozwiązanie

Błąd Element is not clickable at point (x, y)może wynikać z różnych czynników. Możesz się z nimi skontaktować, korzystając z jednej z następujących procedur:

1. Element nie jest klikany z powodu wywołań JavaScript lub AJAX

Spróbuj użyć Actionsklasy:

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

2. Element nie jest klikany, ponieważ nie znajduje się w rzutni

Spróbuj użyć, JavascriptExecutoraby przenieść element do rzutni:

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

3. Strona jest odświeżana, zanim element stanie się klikalny.

W takim przypadku wywołaj ExplicitWait, czyli WebDriverWait, jak wspomniano w punkcie 4.

4. Element jest obecny w DOM, ale nie można go kliknąć.

W tym przypadku indukuj ExplicitWait z ExpectedConditionsustawioną na, elementToBeClickableaby element był klikalny:

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

5. Element jest obecny, ale ma tymczasową nakładkę.

W takim przypadku indukuj ExplicitWaitz ExpectedConditionsustawieniem na, invisibilityOfElementLocatedaby nakładka była niewidoczna.

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

6. Element jest obecny, ale ma trwałą nakładkę.

Służy JavascriptExecutordo wysyłania kliknięcia bezpośrednio na element.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
DebanjanB
źródło
1
Do # 6 / # 2 powyżej: Metoda .ExecuteScript jest teraz dostępna z samego sterownika sieciowego, a nie z JavascriptExecutor. Dzięki za dobrze napisaną odpowiedź!
Tabrock
6
Omówiłeś wiele możliwości, w których tylko 5 i 6 są poprawnymi sposobami obsługi wspomnianego błędu. Pierwsze cztery generują inny błąd, dla którego podane rozwiązanie nie zadziała. Na przykład punkt numer 3 jest w rzeczywistości przestarzałym problemem z elementem, który nie działałby, nawet jeśli czekasz z metodą elementToBeClickble. Trzeba to traktować inaczej.
Rajagopalan
6 nie jest tak naprawdę poprawne; to sposób na obejście problemu, 5 byłoby poprawne, gdyby zastosowano prawidłowy oczekiwany stan. 4 wygląda na jedyną poprawną odpowiedź.
Ardesco
1
Ważną rzeczą do zapamiętania jest to, że kiedy emulujemy działania użytkownika, może być bardzo niepożądane użycie javascript do kliknięcia elementu, którego w ogóle nie można kliknąć (# 6). Użytkownik końcowy nigdy by tego nie zrobił, po prostu przewinąłby do elementu, aby przenieść go do widoku lub odrzucił jakąkolwiek nakładkę (jeśli pozwala na to strona), aby z nim współdziałać.
p_champ
17

Na wypadek, gdybyś musiał go używać z JavaScriptem

Możemy użyć argumentów [0] .click () do symulacji operacji kliknięcia.

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);
Rester Test
źródło
Pracuje! Nie mogę sobie wyobrazić, jak to działa, ale poza tym klika na warstwę nakładki (oczekiwanie na zamknięcie nakładki przez „invisibilityOfElementLocated” trwa około 30 sekund).
Fisk
Czy możesz napisać pełne wyjaśnienie, ponieważ piszę w Javie i nie jest to znana wojna, czy możesz podać pełny przepływ?
Bastian
4

Napotkałem ten błąd podczas próby kliknięcia jakiegoś elementu (lub jego nakładki, nie obchodziło mnie to), a inne odpowiedzi nie działały dla mnie. Naprawiłem to, używając elementFromPointDOM API, aby znaleźć element, który Selenium chciał, abym zamiast tego kliknął:

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()

Miałem również sytuacje, w których element się poruszał , na przykład dlatego, że element znajdujący się nad nim na stronie wykonywał animowane rozwijanie lub zwijanie. W takim przypadku pomogła ta klasa oczekiwanego warunku. Dajesz mu elementy, które są animowane , a nie te, które chcesz kliknąć. Ta wersja działa tylko dla animacji 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
rescdsk
źródło
2

Możesz spróbować

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
fg78nc
źródło
To mi nie pomaga.
Maria
Tak: org.openqa.selenium.WebDriverException: Elementu nie można kliknąć w punkcie (36, 72). Inny element otrzyma kliknięcie: <div tabindex = "0" class = "waiter-ui-lock"> </div> Czas trwania lub limit czasu polecenia: 70 milisekund
Maria,
1
spróbuj wykonać następujące czynnościWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc
To też nie pomaga. Mam dwa wyjątki i jeden AssertionError, a następnie jakiś błąd "Element nie jest klikalny w punkcie"
Maria,
1
Jeśli używam Thread.Sleep, wszystko działa. Ale używam Wait all fail.
Maria
2

Przewinięcie strony do najbliższego punktu wspomnianego w wyjątku załatwiło sprawę. Poniżej znajduje się fragment kodu:

$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);");

UWAGA: używam webdrivera php na Facebooku

Sudheesh.MS
źródło
0

Najlepszym rozwiązaniem jest zastąpienie funkcji kliknięcia:

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;
        }
    }
}
user2274204
źródło
0

W C # miałem problem ze sprawdzeniem RadioButton, a to zadziałało:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);
Ayub
źródło
0

Można spróbować z poniższym kodem

 WebDriverWait wait = new WebDriverWait(driver, 30);

Przekazanie innego elementu spowoduje kliknięcie :<a class="navbar-brand" href="#"></a>

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

Podaj identyfikator klikalnego przycisku, jak pokazano poniżej

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }
Nagarjuna Yalamanchili
źródło