@ jarib의 답변에 추가하기 위해 경쟁 조건을 제거하는 데 도움이되는 몇 가지 확장 방법을 만들었습니다.
내 설정은 다음과 같습니다.
"Driver.cs"라는 클래스가 있습니다. 드라이버 및 기타 유용한 정적 함수에 대한 확장 메소드로 가득 찬 정적 클래스를 포함합니다.
일반적으로 검색해야하는 요소의 경우 다음과 같은 확장 방법을 만듭니다.
public static IWebElement SpecificElementToGet(this IWebDriver driver) {
return driver.FindElement(By.SomeSelector("SelectorText"));
}
이를 통해 코드가있는 테스트 클래스에서 해당 요소를 검색 할 수 있습니다.
driver.SpecificElementToGet();
이제 이것이 결과 StaleElementReferenceException
가되면 드라이버 클래스에 다음 정적 메소드가 있습니다.
public static void WaitForDisplayed(Func<IWebElement> getWebElement, int timeOut)
{
for (int second = 0; ; second++)
{
if (second >= timeOut) Assert.Fail("timeout");
try
{
if (getWebElement().Displayed) break;
}
catch (Exception)
{ }
Thread.Sleep(1000);
}
}
이 함수의 첫 번째 매개 변수는 IWebElement 객체를 반환하는 모든 함수입니다. 두 번째 파라미터는 초 단위의 타임 아웃입니다 (타임 아웃 코드는 Selenium IDE for FireFox에서 복사되었습니다). 이 코드는 다음과 같은 방식으로 오래된 요소 예외를 피하는 데 사용될 수 있습니다.
MyTestDriver.WaitForDisplayed(driver.SpecificElementToGet,5);
위의 코드는 예외가 발생하지 않고 평가 되고 5 초가 지날 driver.SpecificElementToGet().Displayed
때까지 호출 합니다. 5 초 후에 테스트가 실패합니다.driver.SpecificElementToGet()
.Displayed
true
반대로, 요소가 존재하지 않을 때까지 다음 기능을 같은 방식으로 사용할 수 있습니다.
public static void WaitForNotPresent(Func<IWebElement> getWebElement, int timeOut) {
for (int second = 0;; second++) {
if (second >= timeOut) Assert.Fail("timeout");
try
{
if (!getWebElement().Displayed) break;
}
catch (ElementNotVisibleException) { break; }
catch (NoSuchElementException) { break; }
catch (StaleElementReferenceException) { break; }
catch (Exception)
{ }
Thread.Sleep(1000);
}
}