수색…


Selenium WebDriver의 대기 유형

웹 애플리케이션을 실행하는 동안 로딩 시간을 고려해야합니다. 코드가 아직로드되지 않은 요소에 액세스하려고하면 WebDriver에서 예외가 발생하고 스크립트가 중지됩니다.

Wait에는 세 가지 유형이 있습니다.

  • 암시 적 대기
  • 명시 적 대기
  • 유창한 대기

암시 적 대기는 프로그램 전체에서 대기 시간을 설정하는 데 사용되고 명시 적 대기는 특정 부분에서만 사용됩니다.


암시 적 대기

암시 적 대기는 WebDriver가 즉시 사용할 수없는 요소를 찾거나 시도 할 때 특정 시간 동안 DOM을 폴링하도록 지시하는 것입니다. 암시 적 대기는 기본적으로 WebDriver가 찾고있는 지정된 웹 요소가없는 경우 WebDriver에보고 자하는 대기 시간을 알려주는 방식입니다. 기본 설정은 0입니다. 일단 설정되면 암시 적 대기 시간은 WebDriver 개체 인스턴스의 수명 동안 설정됩니다. 암시 적 대기는 다음 스 니펫을 사용하여 코드의 인스턴스화 부분에 선언됩니다.

Java의 예 :

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// You need to import the following class - import java.util.concurrent.TimeUnit;

C #의 예 :

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));

따라서이 경우 UI (DOM)에 지정된 요소가없는 경우 WebDriver가 15 초 동안 기다려야한다고 알려줍니다.


명백한 대기

일부 요소가로드되는 데 더 많은 시간이 소요될 때 인스턴스가 발생할 수 있습니다. 이러한 경우에 대한 암시 적 대기 설정은 브라우저가 모든 요소에 대해 동일한 시간 동안 불필요하게 대기하므로 자동화 시간이 길어 지므로 의미가 없습니다. 명시 적 대기는 일부 특정 요소에 대해 암시 적 대기를 우회하여 여기에서 도움이됩니다.

명시 적 대기는 특정 웹 요소에만 국한된 지능형 대기입니다. 명시 적 대기를 사용하면 기본적으로 WebDriver에 최대 값을 알리는 것이 포기하기 전에 X 단위 시간을 기다리는 것입니다.

명시 적 대기는 WebDriverWait 및 ExpectedConditions 클래스를 사용하여 수행됩니다. 아래 예제에서 id가 username 인 요소가 다음 명령으로 진행하기 전에 최대 10 초 동안 기다려야합니다. 여기 단계가 있습니다.

Java의 예 :

//Import these two packages:
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

//Declare a WebDriverWait variable. In this example, we will use myWaitVar as the name of the variable.
WebDriverWait myWaitVar = new WebDriverWait(driver, 30);

//Use myWaitVar with ExpectedConditions on portions where you need the explicit wait to occur. In this case, we will use explicit wait on the username input before we type the text tutorial onto it.
myWaitVar.until(ExpectedConditions.visibilityOfElementLocated(By.id(“username”)));
driver.findElement(By.id(“username”)).sendKeys(“tutorial”);

ExpectedConditions 클래스에는 요소를 기다리는 미리 정의 된 공통 조건이 있습니다. Java 바인딩에서 이러한 조건의 목록을 보려면 여기클릭하십시오 .

C #의 예 :

using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.PhantomJS;

// You can use any other WebDriver you want, such as ChromeDriver.
using (var driver = new PhantomJSDriver())
{
    driver.Navigate().GoToUrl("http://somedomain/url_that_delays_loading");

    // We aren't going to use it more than once, so no need to declare this a variable.
    new WebDriverWait(driver, TimeSpan.FromSeconds(10))
        .Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));

    // After the element is detected by the previous Wait, 
    // it will display the element's text
    Console.WriteLine(driver.FindElement(By.Id("element-id")).Text);
}

이 예에서 시스템은 요소가 표시 될 때까지 10 초 동안 대기합니다. 타임 아웃 후에 요소가 보이지 않으면 WebDriver는 WebDriverTimeoutException 시킵니다.

참고 : 요소가 10 초 제한 시간 전에 표시되면 시스템은 즉시 추가 프로세스를 진행합니다.


유창한 대기

암시 적 및 명시 적 대기와 달리 유창 대기는 두 개의 매개 변수를 사용합니다. 시간 종료 값 및 폴링 빈도. 시간 제한 값이 30 초이고 폴링 빈도가 2 초라고 가정 해 봅시다. WebDriver는 제한 시간 값 (30 초)까지 2 초마다 요소를 확인합니다. 결과없이 시간 초과 값이 초과되면 예외가 발생합니다. 다음은 유창한 대기 구현을 보여주는 샘플 코드입니다.

Java의 예 :

Wait wait = new FluentWait(driver).withTimeout(30, SECONDS).pollingEvery(2, SECONDS).ignoring(NoSuchElementException.class);


WebElement testElement = wait.until(new Function() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(By.id("testId"));
    }
});

유창한 대기 시간을 사용하는 또 다른 이점은 기다리는 동안 특정 유형의 예외 (예 : NoSuchElementExceptions)를 무시할 수 있다는 것입니다. 이러한 모든 조항 때문에 유창 대기는 AJAX 응용 프로그램과 요소로드 시간이 자주 변동하는 시나리오에서 유용합니다. 유창한 대기 시간을 전략적으로 사용하면 자동화 작업이 크게 향상됩니다.


서로 다른 유형의 명시 적 대기 조건

명시 적 대기 상태에서는 조건이 발생할 것으로 예상됩니다. 예를 들어 요소를 클릭 할 수있을 때까지 기다리고 싶습니다.

다음은 몇 가지 일반적인 문제에 대한 데모입니다.

참고 :이 예제의 모든 당신이 하나를 사용할 수 있습니다에 By 같은 위치 지정자로 classname , xpath , link text , tag name 또는 cssSelector


요소가 표시 될 때까지 기다립니다.

예를 들어, 웹 사이트를로드하는 데 시간이 걸리는 경우 페이지로드가 완료되고 WebDriver에 요소가 표시 될 때까지 기다릴 수 있습니다.

기음#

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));

자바

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("element-id")));

요소가 더 이상 보이지 않을 때까지 기다립니다.

이전과 동일하지만 반대였습니다.

기음#

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.Id("element-id")));

자바

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("element-id")));

텍스트가 지정된 요소에 나타날 때까지 기다립니다.

기음#

IWebElement element = driver.FindElement(By.Id("element-id"));

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.TextToBePresentInElement(element, "text"));

자바

WebElement element = driver.findElement(By.id("element-id"));

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.textToBePresentInElement(element, "text"));

위의 링크로 가면 대기 상태가 모두 표시됩니다.

이러한 대기 조건의 사용 차이는 입력 매개 변수에 있습니다.

즉, WebElement의 입력 매개 변수가 WebElement 인 경우 WebElement를 전달해야하므로 By 로케이터를 입력 매개 변수로 사용하는 경우 요소 로케이터를 전달해야합니다.

어떤 대기 조건을 사용하고 싶은지 현명하게 선택하십시오.

Ajax 요청 완료 대기

기음#

using OpenQA.Selenium
using OpenQA.Selenium.Chrome;
using System.Threading;

namespace WebDriver Tests
{
    class WebDriverWaits
    {
        static void Main()
        {
            IWebDriver driver = new ChromeDriver(@"C:\WebDriver");
            
            driver.Navigate().GoToUrl("page with ajax requests");
            CheckPageIsLoaded(driver);

            // Now the page is fully loaded, you can continue with further tests.
        }

        private void CheckPageIsLoaded(IWebDriver driver)
        {
            while (true)
            {
                bool ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
                if (ajaxIsComplete)
                    return;
                Thread.Sleep(100);
            }
        }
    }
}

이 예제는 ajax 요청이있는 페이지에 유용합니다. 여기서는 IJavaScriptExecutor 를 사용하여 자체 JavaScript 코드를 실행합니다. while 루프 내에 있으므로 ajaxIsComplete == true 될 때까지 계속 실행되므로 return 문이 실행됩니다.

jQuery.active0 인지 확인하여 모든 ajax 요청이 완료되었는지 확인합니다. 이것은 새로운 ajax 요청이 만들어 질 jQuery.active 마다 jQuery.active 가 증가하고 요청을 보완 할 때마다 감소하므로 jQuery.active == 0 때 모든 Ajax 요청이 완료되어야한다는 것을 추론 할 수 있기 때문입니다.

유창한 대기

유창한 대기는 명시 적 대기 ( WebDriverWait )의 수퍼 클래스로서 대기 함수에 대한 인수를 허용 할 수 있으므로 더 구성 가능합니다. 그것은 이후 나는 암시 대기에 전달할 수 있습니다 모범 사례 를 방지하기가.

사용법 (Java) :

Wait wait = new FluentWait<>(this.driver)
        .withTimeout(driverTimeoutSeconds, TimeUnit.SECONDS)
        .pollingEvery(500, TimeUnit.MILLISECONDS)
        .ignoring(StaleElementReferenceException.class)
        .ignoring(NoSuchElementException.class)
        .ignoring(ElementNotVisibleException.class);

WebElement foo = wait.until(ExpectedConditions.presenceOfElementLocated(By.yourBy));

// or use your own predicate:
WebElement foo = wait.until(new Function() {
  public WebElement apply(WebDriver driver) {
    return element.getText().length() > 0;
  }
});

Explicit wait 를 기본값으로 사용하면 FluentWait<WebDriver> 기본값 인 DEFAULT_SLEEP_TIMEOUT = 500; NotFoundException 무시합니다.

유창한 대기

각 FluentWait 인스턴스는 조건을 검사 할 빈도뿐만 아니라 조건을 기다리는 최대 시간을 정의합니다. 또한 사용자는 페이지에서 요소를 검색 할 때 NoSuchElementExceptions와 같이 기다리는 동안 특정 유형의 예외를 무시하도록 대기 시간을 구성 할 수 있습니다. 이는 드라이버와 관련되어 있습니다.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS) //actuall wait for the element to pe present
.pollingEvery(5, SECONDS) //selenium will keep looking for the element after every 5seconds
.ignoring(NoSuchElementException.class); //while ignoring this condition
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("username"));


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow