ABOUT ME

Today
Yesterday
Total
  • Selenium WebDriver에서 탐색 한 후 현재 페이지를 어떻게 안정적으로 확인합니까?
    카테고리 없음 2020. 8. 4. 16:53

    질문


    Selenium WebDriver 및 IEDriverServer.exe 2.32.3.0을 사용하는 웹 테스트에서 특정 URL로 이동 한 후 현재 페이지의 제목을 확인해야합니다. 코드는 다음과 같습니다.

    _webDriver.Navigate().GoToUrl("...");
    Assert.That(_webDriver.Title, Is.EqualTo("..."));
    

    이것은 때때로 작동하지만 산발적으로 끊어집니다-제목이 예상과 다릅니다 (그러나 여전히 이전 페이지의 제목).

    StackOverflow에서 읽었습니다 ( C# WebDriver-페이지 제목 IWebDriver.Title 속성이 탐색이 완료 될 때까지 자동 대기하지 않는 이유는 무엇입니까?) 대신 페이지를로드하기 전에 어설 션이 실패하지만 대신 < code> WebDriverWait API입니다.

    제목을 기다리는 수동을 구현했습니다.

     var wait = new WebDriverWait(_webDriver, TimeSpan.FromSeconds (3.0));
     wait.Until(d => d.Title == expectedTitle);
     

    그러나 이것은 때때로 3 초 동안 기다린 다음 WebDriverTimeoutException 을 발생시킵니다. 코드를 실행하는 빌드 에이전트는 매우 빠르며 테스트중인 웹 사이트는 사소한 것이므로 (개발을 시작하는 것) 실제로 탐색하는 데 3 초가 걸리지 않을 것이라고 확신합니다. 다른 StackOverflow 질문에서 원본 포스터에도 WebDriverTimeoutException 이 발생하여 발견하고 무시했습니다.

    나는 그 해결책이 약간 벗겨서 다른 해결책을 시도했다. </code> 속성에 HTML의 ID를 부여하고 페이지가 완료 될 때까지 기다려야하는 IWebDriver.FindElement를 사용했습니다.

    Assert.That(_webDriver.FindElement(By.Id(ViewIDs.Shared._Layout.Title)).Text, Is.EqualTo(page.ExpectedTitle));
    

    처음에는 효과가있는 것 같았습니다. 그러나 안정적으로 그렇지 않은 경우가 있습니다.

    OpenQA.Selenium.NoSuchElementException : Unable to find element with id == _Layout-title
     at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
      at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
       at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
        at OpenQA.Selenium.By.FindElement(ISearchContext context)
         at ...
         

    (또한 WebDriver / IEDriverServer 2.33.0.0으로 업그레이드를 시도했지만 해당 버전에서는 </code> 태그의 텍스트가 항상 비어 있습니다 ...)

    따라서 내 질문. Selenium WebDriver에서 탐색 한 후 현재 페이지를 어떻게 안정적으로 확인합니까? 작동하는 좋은 패턴이 있습니까?


    답변1


    나는 매우 비슷한 문제에 부딪쳤다. 나는 여전히 이유를 알 수 없었지만 isElementPresent 검사를하지 않고 요소를 사용하려고하면 때때로 실패합니다. 내 솔루션은 약간 "고가"이지만 아직 신뢰할만한 대안을 찾지 못했습니다.

    내 예제는 자바로 번역하기가 쉽지 않지만 라이브러리는 없습니다.

        waitForElement("_Layout-title", 45);
    

    그런 다음 코드를 계속하십시오

        Assert.That(_webDriver.FindElement(By.Id(ViewIDs.Shared._Layout.Title)).Text, Is.EqualTo(page.ExpectedTitle));
    

    이것은 요소를 찾기 위해 설정된 횟수 (이 경우 45)를 시도합니다. id = _Layout-title이 있으면 다음 코드 줄로 계속 진행하여 어설 션을 수행합니다. 완벽하지는 않지만 테스트를 훨씬 안정적으로 만들었습니다.


    답변2


    방금 CodeProject :

    private void WaitUntilLoaded()
    {
        var wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(%));
            wait.Until(x =>
                {
                        return ((IJavaScriptExecutor)this.driver)
                                .ExecuteScript("return document.readyState").Equals("complete");
                                    });
                                    }
                                    

    w3schools 는 가장 널리 사용됩니다 브라우저.

    현재 Firefox에서 테스트 할 때 Mozilla 자체 페이지 방법. IMHO는 용을 피할 가치가 있습니다.

    그것은 나를 주었다

    wait.Until(p => p.FindElement(
        By.Id("somethingThatIsDisplayedWhenMyAsyncronousStuffIsFinished")
            ).Displayed);
            

    하루를 구했습니다.


     

     

     

     

    출처 : https://stackoverflow.com/questions/17150685/how-do-i-reliably-check-the-current-page-after-navigation-in-selenium-webdriver

    댓글

Designed by Tistory.