[java] Selenium 웹 드라이버 및 Java. (x, y) 지점에서 요소를 클릭 할 수 없습니다. 다른 요소는 클릭을받습니다.

명시 적 대기를 사용했고 경고가 있습니다.

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



답변

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


답변

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

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

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


답변

일부 요소 (또는 해당 오버레이, 상관 없음)를 클릭하려고 할 때이 오류가 발생했으며 다른 답변이 작동하지 않았습니다. 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


답변

당신은 시도 할 수 있습니다

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


답변

예외에 언급 된 지점으로 페이지를 스크롤하는 것이 저에게 트릭이었습니다. 다음은 코드 스 니펫입니다.

$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을


답변

가장 좋은 해결책은 클릭 기능을 재정의하는 것입니다.

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


답변

C #에서 확인하는 데 문제가 있었고 RadioButton이것은 나를 위해 일했습니다.

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