Selenium 웹 드라이버 및 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

@Maria 어떤 라인에서 오류가 발생합니까? 감사합니다
DebanjanB

@DebanjanB 인라인 : driver.findElement (By.id ( "navigationPageButton")). click ();
Maria

이 오류는 타겟 요소 (고정 / 절대 위치 오버레이) 위에 다른 요소가 겹치거나 Z- 색인이 너무 낮음을 의미합니다. 이는 전환을 사용하는 호버 효과로 인해 발생할 수 있습니다 (최소 제한 시간보다 느리게,이 경우 393ms). #navigationPageButton표시 될 때까지 기다리 거나 (또는 elementToBeClickable()해당 요소를 사용하여 클릭 가능 ) 버튼을 클릭 할 수 있도록 모든 전제 조건이 충족되는지 확인해야합니다.
try-catch-finally

답변:


192

WebDriverException : 요소는 (x, y) 지점에서 클릭 할 수 없습니다.

이것은 java.lang.RuntimeException 을 확장 하는 전형적인 org.openqa.selenium.WebDriverException 입니다 .

이 예외의 필드는 다음과 같습니다.

  • 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 즉, 4 번 항목에서 언급 한대로 WebDriverWait 를 합니다.

4. 요소가 DOM에 있지만 클릭 할 수 없습니다.

이 경우 요소를 클릭 할 수 있도록 설정하여 ExplicitWait 를 유도합니다 .ExpectedConditionselementToBeClickable

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

5. 요소가 있지만 임시 오버레이가 있습니다.

이 경우에 유도 ExplicitWaitExpectedConditions로 설정 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가 아닌 웹 드라이버 자체에서 액세스 할 수 있습니다. 잘 작성된 답변에 감사드립니다!
Tabrock

6
언급 된 오류를 처리하는 올바른 방법은 5 개와 6 개 뿐인 많은 가능성을 다루었습니다. 처음 4 개는 제공 한 솔루션이 작동하지 않는 다른 오류를 발생시킵니다. 예를 들어, 3 번 포인트는 elementToBeClickble 메소드로 얼마나 오래 기다려도 작동하지 않는 오래된 요소 문제입니다. 그것은 다르게 처리되어야합니다.
Rajagopalan

6은 실제로 정확하지 않습니다. 문제를 해결하기위한 해킹이며, 올바른 예상 조건이 사용 된 경우 5가 정확합니다. 4가 유일한 정답 인 것 같습니다.
Ardesco

1
주목해야 할 중요한 점은 사용자의 행동을 에뮬레이션 할 때 자바 스크립트를 사용하여 전혀 클릭 할 수없는 요소를 클릭하는 것은 매우 바람직하지 않을 수 있다는 것입니다 (# 6). 최종 사용자는 그렇게하지 않을 것입니다. 요소로 스크롤하여 뷰포트로 가져 오거나 (페이지에서 허용하는 경우) 상호 작용할 오버레이를 닫습니다.
p_champ

17

Javascript와 함께 사용해야하는 경우

arguments [0] .click ()을 사용하여 클릭 작업을 시뮬레이션 할 수 있습니다.

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

공장! 작동 방식을 상상할 수 없지만 그렇지 않으면 오버레이 레이어를 클릭합니다 ( 'invisibilityOfElementLocated'에 의해 오버레이가 닫히는 데는 약 30 초가 걸립니다.).
Fisk

내가 자바로 작성하고 익숙한 전쟁이 아니기 때문에 전체 설명을 작성해 주시겠습니까?
Bastian

4

일부 요소 (또는 해당 오버레이, 상관 없음)를 클릭하려고 할 때이 오류가 발생했으며 다른 답변이 작동하지 않았습니다. elementFromPointDOM API를 사용하여 Selenium이 대신 클릭하기를 원하는 요소를 찾아 수정했습니다 .

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

예를 들어 페이지 위의 요소가 애니메이션 확장 또는 축소를 수행했기 때문에 요소가 움직이는 상황도있었습니다. 이 경우이 Expected Condition 클래스가 도움이되었습니다. 클릭하려는 요소가 아니라 애니메이션 요소를 제공합니다 . 이 버전은 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 밀리 초
Maria

1
다음 시도WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc

그것은 너무 도움이 아닙니다. 두 개의 예외와 하나의 AssertionError가 있고 다음 일부 오류 "요소가 지점에서 클릭 할 수 없습니다"
Maria

1
Thread.Sleep을 사용하면 모두 작동합니다. 하지만 나는 Wait all fail을 사용합니다.
Maria

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

참고 : 내가 사용하는 페이스 북 PHP webdriver을


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']")));

아래와 같이 클릭 가능한 버튼 ID 전달

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.