Selenium WebDriver - 요소를 클릭할 수 있는지 여부를 확인합니다(즉, Dojo 모달 라이트 박스에 의해 가려지지 않음).
저는 Ajax가 매우 많은 웹 애플리케이션을 테스트하기 위해 자동화된 스크립트를 작성합니다.예를 들어, 모달 대화상자가 " 텍스트와 함께 표시됩니다.Saving...
라이트 박스가 회색으로 표시되는 동안 설정을 저장합니다.
내 테스트 스크립트는 메시지가 사라지기 전에 테스트의 다음 링크를 클릭하려고 합니다.Firefox를 구동할 때는 거의 항상 작동하지만 Chrome을 구동할 때는 다음과 같은 오류가 표시됩니다.
Exception in thread "main" org.openqa.selenium.WebDriverException: Element is not clickable at point (99.5, 118.5). Other element would receive the click: <div class="dijitDialogUnderlay _underlay" dojoattachpoint="node" id="lfn10Dijit_freedom_widget_common_environment_Dialog_8_underlay" style="width: 1034px; height: 1025px; "></div> (WARNING: The server did not provide any stacktrace information)
이 문제는 라이트 박스가 클릭하려는 요소를 흐리게 하기 때문에 발생합니다.링크를 클릭하기 전에 라이트 박스가 사라질 때까지 기다립니다.
라이트 박스가 더 이상 존재하지 않는지 확인하는 것은 유효한 해결 방법이 아닙니다. 여러 수준의 모달 대화 상자와 라이트 박스가 있으며 이러한 대화 상자를 쉽게 구분할 수 없기 때문입니다.
셀레늄에서 요소를 클릭할 수 있는지 여부를 감지할 수 있는 방법이 있습니까(다른 요소가 방해하지 않음)?트라이/캐치가 해결책이 될 수도 있지만, 가능한지 제대로 확인하고 싶습니다.
웹 드라이버 대기 조건을 사용합니다.
WebDriverWait wait = new WebDriverWait(yourWebDriver, 5);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//xpath_to_element")));
웹 드라이버는 요소를 클릭할 수 있을 때까지 5초 동안 기다립니다.
사용할 수 있습니다.ExpectedConditions.invisibilityOfElementLocated(By by)
요소가 DOM에 보이지 않거나 존재하지 않을 때까지 기다리는 메서드입니다.
WebDriverWait wait = new WebDriverWait(yourWebDriver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("yourSavingModalDialogDiv")));
따라서 모달 대화 상자가 보이지 않거나 DOM에서 꺼지는 데 걸리는 시간에 따라 웹 드라이버가 대기합니다.대기 시간은 최대 10초입니다.
다음을 생성할 수 있습니다.clickUntil
웹 드라이버를 수행하는 함수/메소드는 요소가 시간 초과로 클릭될 때까지 기다립니다.요소를 클릭하고 "요소를 클릭할 수 없습니다" 오류 메시지를 클릭하거나 시간이 초과될 때까지 삭제합니다.
dojo에서 그것을 어떻게 쓰는지 확실하지 않지만, 그것은 아이디어입니다.
저도 같은 문제가 있지만, 현장에서 많은 입력을 테스트했습니다.하나는 제가 테스트한 클릭 가능하고 다른 하나는 방금 건너뛴 클릭 불가능합니다.try() catch() Simply Code:
for(){ // for all my input
try {
driver.findElement(By.xpath("...."
+ "//input)["+(i+1)+"]")).click();
... tests...
} catch(Exception e) {
if(e.getMessage().contains("is not clickable at point")) {
System.out.println(driver.findElement(By.xpath(locator)).
getAttribute("name")+" are not clicable");
} else {
System.err.println(e.getMessage());
}
}
더욱 우아함:
@SuppressWarnings("finally")
public boolean tryClick(WebDriver driver,String locator, locatorMethods m) {
boolean result = false;
switch (m) {
case xpath:
try {
driver.findElement(By.xpath(locator)).click();
result= true;
} catch (Exception e) {
if(e.getMessage().contains("is not clickable at point")) {
System.out.println(driver.findElement(By.xpath(locator)).getAttribute("name")+" are not clicable");
} else {
System.err.println(e.getMessage());
}
} finally {
break;
}
case id:
try {
driver.findElement(By.id(locator)).click();
return true;
} catch (Exception e) {
if(e.getMessage().contains("is not clickable at point")) {
System.out.println(driver.findElement(By.id(locator)).getAttribute("name")+" are not clicable");
} else {
System.err.println(e.getMessage());
}
} finally {
break;
}
default:
System.err.println("Unknown locator!");
}
return result;
}
스칼라에서:
대기 표준 코드(가시성/가시성)
(new WebDriverWait(remote, 45)).until( ExpectedConditions.visibilityOf(remote.findElement(locator)) ) Thread.sleep(3000)
로그에서 더 많은 가시성:
while (remote.findElement(locator).isDisplayed) { println(s"isDisplayed: $ii $a : " + remote.findElement(locator).isDisplayed) Thread.sleep(100) }
비동기 JavaScript 프로세스가 있는 경우 타임스탬프가 있는 웹 요소를 사용합니다.
val oldtimestamp = remote.findElements(locator).get(0).getAttribute("data-time-stamp") while (oldtimestamp == remote.findElements(locator).get(0).getAttribute("data-time-stamp")) { println("Tstamp2:" + remote.findElements(locator).get(0).getAttribute("data-time-stamp")) Thread.sleep(200) }
언급URL : https://stackoverflow.com/questions/9878478/selenium-webdriver-determine-if-element-is-clickable-i-e-not-obscured-by-doj
'programing' 카테고리의 다른 글
존재하는 경우, 다른 삽입을 선택한 다음 선택 (0) | 2023.09.05 |
---|---|
노드 스크립트를 실행할 때 현재 셸 컨텍스트에서 작업 디렉터리 변경 (0) | 2023.08.31 |
*ngFor에서 동적 ID를 설정하는 방법은 무엇입니까? (0) | 2023.08.31 |
MySQL에서 "ADD KEY"와 "ADD INDEX"의 차이점은 무엇입니까? (0) | 2023.08.31 |
UI 보기의 배경 이미지를 채우는 방법 (0) | 2023.08.31 |