명시 적 대기를 사용했고 경고가 있습니다.
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 를 유도합니다 .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()
예를 들어 페이지 위의 요소가 애니메이션 확장 또는 축소를 수행했기 때문에 요소가 움직이는 상황도있었습니다. 이 경우이 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);