Java에서 Selenium-WebDriver에 몇 초 동안 대기하도록 요청하려면 어떻게 해야 하나요?
Java Selenium-WebDriver를 만들고 있어요.나는 덧붙였다.
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
그리고.
WebElement textbox = driver.findElement(By.id("textbox"));
어플리케이션이 사용자 인터페이스를 로드하는 데 몇 초가 소요되기 때문입니다.그래서 암묵 대기 시간을 2초로 설정했습니다.요소 텍스트 상자를 찾을 수 없습니다.
에 덧붙입니다.Thread.sleep(2000);
이제 잘 작동합니다.어떤 방법이 더 나을까요?
대기에는 명시적 대기 및 암묵적 대기라는 두 가지 유형이 있습니다.명시적 대기라는 개념은
WebDriverWait.until(condition-that-finds-the-element);
암묵적 대기 개념은
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
여기서 세부 사항의 차이를 알 수 있습니다.
대기explicit wait)를 .fluentWait
( ) :
public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
});
return foo;
};
fluentWait
이치『 』의 fluentWait
: 타임아웃과 폴링 간격이 즉시 설정되어 있는 Wait 인터페이스의 실장. 각 FluentWait 인스턴스는 조건을 대기하는 최대 시간 및 조건을 확인하는 빈도를 정의합니다. 또한 대기 중에 NoSchElement 등 특정 유형의 예외를 무시하도록 대기하도록 설정할 수 있습니다.페이지에서 요소를 검색할 때의 예외입니다.자세한 내용은 이쪽
「 」의 fluentWait
WebElement textbox = fluentWait(By.id("textbox"));
이 접근방식은 대기시간을 정확히 알 수 없으며 폴링 간격에서 를 통해 검증되는 요소의 존재 여부를 임의의 시간값을 설정할 수 있기 때문에 IMHO가 더 적합합니다.
이 스레드는 조금 오래된 것이지만, 현재 하고 있는 것을 투고하고 싶다고 생각하고 있습니다(진행중의 작업).
가 걸려 들어 login을 하면 3가지 이 반환됩니다.true
그러나 다음 페이지(예: home.jsp)는 아직 로드를 시작하지 않았습니다.
이는 Expected Conditions 목록을 가져오는 일반적인 대기 방법입니다.
public boolean waitForPageLoad(int waitTimeInSec, ExpectedCondition<Boolean>... conditions) {
boolean isLoaded = false;
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(waitTimeInSec, TimeUnit.SECONDS)
.ignoring(StaleElementReferenceException.class)
.pollingEvery(2, TimeUnit.SECONDS);
for (ExpectedCondition<Boolean> condition : conditions) {
isLoaded = wait.until(condition);
if (isLoaded == false) {
//Stop checking on first condition returning false.
break;
}
}
return isLoaded;
}
다양한 재사용 가능한 Expected Conditions(아래 3가지)를 정의했습니다.이 예에서 예상되는 세 가지 조건에는 document.readyState = 'complete', 'wait_dialog' 없음 및 'spinners'(비동기 데이터가 요청되었음을 나타내는 오류)가 포함됩니다.
첫 번째 웹 페이지만 일반적으로 모든 웹 페이지에 적용할 수 있습니다.
/**
* Returns 'true' if the value of the 'window.document.readyState' via
* JavaScript is 'complete'
*/
public static final ExpectedCondition<Boolean> EXPECT_DOC_READY_STATE = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
String script = "if (typeof window != 'undefined' && window.document) { return window.document.readyState; } else { return 'notready'; }";
Boolean result;
try {
result = ((JavascriptExecutor) driver).executeScript(script).equals("complete");
} catch (Exception ex) {
result = Boolean.FALSE;
}
return result;
}
};
/**
* Returns 'true' if there is no 'wait_dialog' element present on the page.
*/
public static final ExpectedCondition<Boolean> EXPECT_NOT_WAITING = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
Boolean loaded = true;
try {
WebElement wait = driver.findElement(By.id("F"));
if (wait.isDisplayed()) {
loaded = false;
}
} catch (StaleElementReferenceException serex) {
loaded = false;
} catch (NoSuchElementException nseex) {
loaded = true;
} catch (Exception ex) {
loaded = false;
System.out.println("EXPECTED_NOT_WAITING: UNEXPECTED EXCEPTION: " + ex.getMessage());
}
return loaded;
}
};
/**
* Returns true if there are no elements with the 'spinner' class name.
*/
public static final ExpectedCondition<Boolean> EXPECT_NO_SPINNERS = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
Boolean loaded = true;
try {
List<WebElement> spinners = driver.findElements(By.className("spinner"));
for (WebElement spinner : spinners) {
if (spinner.isDisplayed()) {
loaded = false;
break;
}
}
}catch (Exception ex) {
loaded = false;
}
return loaded;
}
};
페이지에 따라 다음 중 하나 또는 모두를 사용할 수 있습니다.
waitForPageLoad(timeoutInSec,
EXPECT_DOC_READY_STATE,
EXPECT_NOT_WAITING,
EXPECT_NO_SPINNERS
);
org.openqa.selenium 클래스에는 미리 정의된 Expected Conditions도 있습니다.support.ui.ui.예상되는 조건
webdriverJs(node.js)를 사용하는 경우
driver.findElement(webdriver.By.name('btnCalculate')).click().then(function() {
driver.sleep(5000);
});
위의 코드는 브라우저가 버튼을 클릭한 후 5초간 대기하도록 합니다.
「」를 사용합니다.Thread.sleep(2000);
무조건적인 대기입니다.테스트 로딩이 빨라진 경우에도 기다려야 합니다.그래서 원칙적으로implicitlyWait
을 사용하다
왜 그런지 implicitlyWait
이 경우는 동작하지 않습니다.측정해 보셨습니까?findElement
예외를 던지기까지 2초가 걸립니다.만약 그렇다면 이 답변에서 설명한 바와 같이 WebDriver의 조건부 대기를 사용해 볼 수 있습니까?
저는 커스텀 조건을 사용하는 것을 좋아합니다.다음은 Python의 코드입니다.
def conditions(driver):
flag = True
ticker = driver.find_elements_by_id("textbox")
if not ticker:
flag = False
return flag
... click something to load ...
self.wait = WebDriverWait(driver, timeout)
self.wait.until(conditions)
대기해야 할 때마다 특정 요소의 존재를 체크함으로써 명시적으로 수행할 수 있습니다(이러한 요소는 페이지에 따라 다를 수 있습니다). find_elements_by_id
list - not,.
클릭이 차단되고 있는 것 같습니까?- WebDriver 를 사용하고 있는 경우는, 다음의 방법으로 기다립니다.JS:
driver.findElement(webdriver.By.name('mybutton')).click().then(function(){
driver.getPageSource().then(function(source) {
console.log(source);
});
});
위의 코드는 버튼을 클릭한 후 다음 페이지가 로드될 때까지 기다렸다가 다음 페이지의 소스를 가져옵니다.
암묵적으로 대기하고 스레드합니다.sleep은 둘 다 동기화 목적으로만 사용됩니다.하지만 다른 점은 스레드를 제외한 전체 프로그램을 암묵적으로 기다릴 수 있다는 것입니다.sleep은 단일 코드에 대해서만 작동합니다.웹 페이지가 새로 고쳐질 때마다 스레드를 사용할 때 프로그램에서 암묵적으로 한 번 대기하는 것이 좋습니다.그 시간에 자..훨씬 더 나을 거야:)
내 코드는 다음과 같습니다.
package beckyOwnProjects;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
public class Flip {
public static void main(String[] args) throws InterruptedException {
WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(2, TimeUnit.MINUTES);
driver.get("https://www.flipkart.com");
WebElement ele=driver.findElement(By.cssSelector(".menu-text.fk-inline-block"));
Actions act=new Actions(driver);
Thread.sleep(5000);
act.moveToElement(ele).perform();
}
}
액션 사용 -
복잡한 사용자 제스처를 에뮬레이트하기 위한 사용자용 API.
암묵적인 대기가 오버라이드되어 대기시간이 짧아질 수 있습니다.[@parames]polschikov]는 Why에 대한 좋은 문서를 가지고 있었다.Selenium 2와의 테스트와 코딩에서 암묵적인 기다림은 좋지만 때로는 명시적으로 기다려야 하는 경우도 있습니다.
잠을 청하는 것은 피하는 것이 좋지만, 때로는 좋은 방법이 없을 수도 있습니다.그러나 Selenium에서 제공하는 다른 대기 옵션이 도움이 됩니다. wait For Page ToLoad와 wait For Frame ToLoad는 특히 유용한 것으로 판명되었습니다.
암묵적인 대기에서 요소가 존재하지만 실제로는 존재하지 않는다고 말하는 경우가 있습니다.
해결책은 driver.findElement 사용을 피하고 명시적 대기를 암묵적으로 사용하는 커스텀 방식으로 대체하는 것입니다.예를 들어 다음과 같습니다.
import org.openqa.selenium.NoSuchElementException;
public WebElement element(By locator){
Integer timeoutLimitSeconds = 20;
WebDriverWait wait = new WebDriverWait(driver, timeoutLimitSeconds);
try {
wait.until(ExpectedConditions.presenceOfElementLocated(locator));
}
catch(TimeoutException e){
throw new NoSuchElementException(locator.toString());
}
WebElement element = driver.findElement(locator);
return element;
}
암묵적인 대기시간을 회피하는 이유는 산발적인 장애 외에 있습니다(이 링크를 참조).
이 "Element" 메서드는 driver.findElement와 같은 방법으로 사용할 수 있습니다.예:
driver.get("http://yoursite.html");
element(By.cssSelector("h1.logo")).click();
트러블 슈팅이나 그 외의 드문 경우에 몇 초간 대기하고 싶은 경우는, Selenium IDE 가 제공하는 것과 같은 일시정지 방법을 작성할 수 있습니다.
public void pause(Integer milliseconds){
try {
TimeUnit.MILLISECONDS.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
답변: Selenium WebDriver를 사용하여 요소를 표시할 때까지 몇 초간 기다립니다.
implicityWait() : WebDriver 인스턴스가 전체 페이지가 로드될 때까지 기다립니다.30~60초 동안 전체 페이지 로드를 기다립니다.
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
ExplicityWait WebDriverWait() : WebDriver 인스턴스가 전체 페이지가 로드될 때까지 기다립니다.
WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOf(textbox));
driver.findElement(By.id("Year")).sendKeys(allKeys);
주의: 특정 WebElement를 처리하려면 ExplicitlyWait WebDriverWait()를 사용하십시오.
2초 동안 기다리려면 다음 코드를 사용하는 것이 좋습니다.
for(int i=0; i<2 && driver.findElements(By.id("textbox")).size()==0 ; i++){
Thread.sleep(1000);
}
Implicit Wait: Implicit Wait 중 Web Driver가 사용 가능하기 때문에 즉시 찾을 수 없는 경우 Web Driver는 지정된 시간 동안 해당 요소를 다시 찾으려고 시도하지 않습니다.지정된 시간이 지나면 예외를 발생시키기 전에 마지막으로 요소 검색을 다시 시도합니다.기본 설정은 0 입니다.시간을 설정하면 웹 드라이버는 WebDriver 오브젝트인스턴스의 기간을 기다립니다.
명시적 대기:특정 요소를 로드하는 데 1분 이상 걸리는 경우가 있습니다.이 경우 Implicit wait에 큰 시간을 설정하고 싶지 않습니다.이렇게 하면 브라우저는 모든 요소에 대해 같은 시간을 기다립니다.이러한 상황을 방지하려면 필요한 요소에만 별도의 시간을 둘 수 있습니다.이렇게 하면 브라우저의 암묵적인 대기시간이 모든 요소에 대해 짧아지고 특정 요소에 대해 길어집니다.
Thread.sleep(1000);
더 나빠집니다.스태틱 대기 상태일 경우 테스트스크립트가 느려집니다.
driver.manage().timeouts.implicitlyWait(10,TimeUnit.SECONDS);
이것은 동적 대기입니다.
- 웹 드라이버가 존재할 때까지 유효하거나 드라이버 수명까지 범위가 있습니다.
- 암묵적으로 기다릴 수도 있습니다.
마지막으로 제가 제안하는 것은
WebDriverWait wait = new WebDriverWait(driver,20);
wait.until(ExpectedConditions.<different canned or predefined conditions are there>);
몇 가지 사전 정의된 조건이 있습니다.
isAlertPresent();
elementToBeSelected();
visibilityOfElementLocated();
visibilityOfAllElementLocatedBy();
frameToBeAvailableAndSwitchToIt();
- 동적 대기이기도 합니다.
- 이 경우 대기 시간은 초밖에 되지 않습니다.
- 사용하는 특정 웹 요소에 대해 명시적 대기를 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/12858972/how-can-i-ask-the-selenium-webdriver-to-wait-for-few-seconds-in-java
'programing' 카테고리의 다른 글
C++ 표준 간 변환:: 벡터 및 C 어레이(복사하지 않음) (0) | 2022.12.26 |
---|---|
file_get_contents("php://input") 또는 $HTTP_RAW_POST_DATA, JSON 요청 본문을 가져오려면 어떤 것이 좋습니까? (0) | 2022.12.26 |
도커 컨테이너, 메모리 소비량 및 로그 (0) | 2022.12.26 |
예외가 발생하지 않았는지 테스트하려면 어떻게 해야 합니까? (0) | 2022.12.26 |
업로드하기 전에 JavaScript에서 파일 MIME 유형을 확인하는 방법 (0) | 2022.12.26 |