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);
}

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

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

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

2

Możesz spróbować

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

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


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;
        }
    }
}

0

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

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

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();
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.