-
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);
하루를 구했습니다.