programing

Selenium 웹 드라이버 및 Java.

nasanasas 2020. 12. 14. 08:26
반응형

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. 요소를 클릭 할 수있게되기 전에 페이지가 새로 고쳐집니다.

이 경우 4 번에서 언급 한 것처럼 ExplicitWaitWebDriverWait유도 합니다.

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

I've also had situations where an element was moving, for example because an element above it on the page was doing an animated expand or collapse. In that case, this Expected Condition class helped. You give it the elements that are animated, not the ones you want to click. This version only works for jQuery animations.

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

You can try

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

Scrolling the page to the near by point mentioned in the exception did the trick for me. Below is code snippet:

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

NOTE: I use Facebook php webdriver

참고URL : https://stackoverflow.com/questions/44912203/selenium-web-driver-java-element-is-not-clickable-at-point-x-y-other-elem

반응형