Selenium 2 WebDriver에서 Ajax 콜이 완료될 때까지 기다립니다.
AJAX를 사용하는 UI를 테스트하기 위해 Selenium 2 WebDriver를 사용하고 있습니다.
드라이버가 Ajax 요청이 완료될 때까지 기다리도록 하는 방법이 있습니까?
기본적으로 다음과 같은 것이 있습니다.
d.FindElement(By.XPath("//div[8]/div[3]/div/button")).Click();
// This click trigger an ajax request which will fill the below ID with content.
// So I need to make it wait for a bit.
Assert.IsNotEmpty(d.FindElement(By.Id("Hobbies")).Text);
jQuery를 사용하여 ajax 요청을 수행할 경우,jQuery.active
속성은 0입니다.다른 라이브러리에도 유사한 옵션이 있을 수 있습니다.
public void WaitForAjax()
{
while (true) // Handle timeout somewhere
{
var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
if (ajaxIsComplete)
break;
Thread.Sleep(100);
}
}
셀레늄 명시적 대기도 여기서 사용할 수 있습니다.그러면 타임아웃을 직접 처리할 필요가 없습니다.
public void WaitForAjax()
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
}
var wait = new WebDriverWait(d, TimeSpan.FromSeconds(5));
var element = wait.Until(driver => driver.FindElement(By.Id("Hobbies")));
Morten Christians의 답변을 기반으로 한 Java 솔루션
public void Wait For Ajax()가 중단됨예외.{ 한편(참){ Boolean ajaxIsComplete = (Boolean)(Javascript)실행자) 드라이버).executeScript("return jQuery.active == 0"); if (ajax Is Complete){부서지다}실.sleep(100);}}
timeout 파라미터를 추가하여 조금 개선합니다.
internal static void WaitForAllAjaxCalls(this ISelenium selenium, IWebDriver driver, int timeout = 40)
{
Stopwatch sw = new Stopwatch();
sw.Start();
while (true)
{
if (sw.Elapsed.Seconds > timeout) throw new Exception("Timeout");
var ajaxIsComplete = (bool)driver.ExecuteScript("return jQuery.active == 0");
if (ajaxIsComplete)
break;
Thread.Sleep(100);
}
}
약간의 개선:
//Wait for Ajax call to complete
public void WaitForAjax1() throws InterruptedException
{
while (true)
{
if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){
break;
}
Thread.sleep(100);
}
}
코드는 다음과 같습니다.
public static void WaitForCommission (WebDriver driver) throws Exception {
for (int second = 0;; second++) {
if (second >= 30) fail("timeout");
try {
if (IsElementActive(By.id("transferPurposeDDL"), driver))
break;
} catch (Exception e) {}
Thread.sleep(1000);
}
}
private static boolean IsElementActive(By id, WebDriver driver) {
WebElement we = driver.findElement(id);
if(we.isEnabled())
return true;
return false;
}
이 코드는 정말 효과가 있다.
Graphene을 사용하는 경우 다음을 사용할 수 있습니다.
Graphene.waitModel().until((Predicate<WebDriver>) input -> (Boolean) ((JavascriptExecutor) input).executeScript("return jQuery.active == 0"));
"XML HTTP 요청"은 Ajax 요청을 서버로 보내는 데 사용되는 프로토콜이므로 이러한 요청의 존재는 Ajax 기반 작업이 진행 중임을 나타냅니다.
브라우저에서 전송되는 XML HTTP 요청을 모니터링할 수 있는 여러 브라우저 플러그인이 있습니다.개인적으로 Firefox용 Firebug 플러그인을 사용하는데 매우 유용한 도구입니다.Firebug가 설치되면 브라우저 창의 오른쪽 하단에 버그와 같은 아이콘이 나타납니다.버그와 같은 아이콘을 클릭하면 위 그림과 같이 Firebug가 실행됩니다."Net"을 선택한 다음 "XHR"을 선택하여 브라우저에서 전송된 모든 XML HTTP 요청이 표시되는 XHR 콘솔을 실행합니다.
나사산을 사용하지 마십시오.가능한 한 sleep()을 실시합니다.다음은 대기시간을 입력으로 받아들이고 지정된 시간 동안 정지시계를 실행하는 코드입니다.
초단위의 입력시간을 30으로 설정할 수 있습니다.
protected void WaitForAjaxToComplete(int timeoutSecs)
{
var stopWatch = new Stopwatch();
try
{
while (stopWatch.Elapsed.TotalSeconds < timeoutSecs)
{
var ajaxIsComplete = (bool)(WebDriver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
if (ajaxIsComplete)
{
break;
}
}
}
//Exception Handling
catch (Exception ex)
{
stopWatch.Stop();
throw ex;
}
stopWatch.Stop();
}
Coypu를 사용하는 경우 AJAX 호출 후 요소가 존재하는지 확인하고 해당 요소를 클릭할 수 있습니다.
private void WaitUntilExistsThenClick(string selectorId)
{
var searchBoxExists = new State(() => browser.FindId(selectorId).Exists());
if (browser.FindState(searchBoxExists) == searchBoxExists)
{
browser.FindId(selectorId).Click();
}
}
언급URL : https://stackoverflow.com/questions/6201425/wait-for-an-ajax-call-to-complete-with-selenium-2-webdriver
'sourcecode' 카테고리의 다른 글
bash 'ls' 출력을 json 배열로 변환합니다. (0) | 2023.03.20 |
---|---|
AngularJS 1.2에서 HTTP 응답 상태 코드를 얻는 방법 (0) | 2023.03.15 |
Security for ( Spring has Permission for Collection ) 。 Security for ( Spring has Permission for Collection ) 。 Security for ( Spring has Permission for Collection ) 。동작 중인 어플리케이션이 메서드 수준의 보.. (0) | 2023.03.15 |
요소가 AngularJS와 클래스가 있는지 확인하는 방법 (0) | 2023.03.15 |
레일: 렌더링 Json 상태 문제 (0) | 2023.03.15 |