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 번에서 언급 한 것처럼 ExplicitWait 즉 WebDriverWait 를 유도 합니다.
4. 요소가 DOM에 있지만 클릭 할 수 없습니다.
이 경우 요소를 클릭 할 수 있도록 설정하여 ExplicitWait 를 유도합니다 .ExpectedConditions
elementToBeClickable
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5. 요소가 있지만 임시 오버레이가 있습니다.
이 경우에 유도 ExplicitWait
로 ExpectedConditions
로 설정 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);
일부 요소 (또는 해당 오버레이, 상관 없음)를 클릭하려고 할 때이 오류가 발생했으며 다른 답변이 작동하지 않았습니다. elementFromPoint
DOM 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
'programing' 카테고리의 다른 글
프로그래밍 방식으로 SwipeRefreshLayout 트리거 (0) | 2020.12.14 |
---|---|
DataTables : 정의되지 않은 'length'속성을 읽을 수 없습니다. (0) | 2020.12.14 |
jQuery 웹 페이지 높이 (0) | 2020.12.14 |
ListView 내부의 ListView 및 버튼 (0) | 2020.12.14 |
"&"문자는 web.config에 저장된 암호를 구분합니다. (0) | 2020.12.14 |