2011-09-01 3 views
1

상황에 따라 일부 AJAX 호출을 사용하여 서버에서 콘텐츠를 검색 한 다음 그 결과를 다른 스크립트에서 생성 된 html 청크에 넣는 경우가 있습니다. 문제는,이 html의 새로운 요소 중 하나 인 watin으로 선택할 수 없다는 것입니다. 브라우저에서 볼 수 있으며 F12를 눌러 코드를 스캔해도 WatiN은 볼 수 없습니다.동적으로로드 된 컨텐츠를 WatiN이 검색하는 방법은 무엇입니까?

WatiN이 현재 HTML 버전이 아닌 페이지의 HTML 소스를 통해서만 스캔하기 때문에 이럴 수 있습니까? 나는 비슷한 상황이 될 것이라고 생각 :

HTML -

<script type="text/javascript"> 
    $('#foo').html("gak"); 
</script> 
... 
<div id="foo">bar</div> 

나는 시도하고 주장 할 때 -

Assert.IsTrue(browser.Div("foo")).ContainsText("gak")); 

는 false를 돌려줍니다.

이것에 대한 아이디어가 있습니까? 또는 jQuery, 그리고 browser.Eval()의 무리를 작성하는 최선의 선택은 무엇입니까?

답변

2

나는 AJAX 페이지를 상당히 테스트합니다. 열쇠는 asnyc 포스트 백이 완료 될 때까지 기다리는 것이다. 당신이 System.Threading.Thread.Sleep (numberOfMilliseconds) <을 할 수있는 "대기"섹션에서

Assert.IsFalse(browser.Div("foo")).ContainsText("gak"); 
browser_action_that_changes_bar_to_gak 
>> Here you need to wait << 
Assert.IsTrue(browser.Div("foo")).ContainsText("gak"); 

이있는 경우 -이 하지 최선의 방법이지만, 정말 간단합니다. 기다리는 것이 필요한 것으로 판단되면 매번 numberOfMilliseconds 번이 아닌 상태를 폴링하는 것이 더 좋습니다. 나는 다른 AJAX 라이브러리는 다른 일을 생각하지만 나를 위해 작동 정말이 유사입니다 : 차라리하는 것보다 내 기본 페이지 클래스의 도우미 함수에 평가에 자바 스크립트()를 넣어 http://pushpontech.blogspot.com/2008/04/ajax-issues-with-watin.html

기사가 한 것처럼 모든 페이지에 삽입하십시오.

.

public bool IsInAsyncPostBack() 
{ 
    const string isAsyncPostBackScript = "Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()"; 
    return bool.Parse(this.Document.Eval(isAsyncPostBackScript)); 
} 

을 그리고 내 WaitForAsyncPostback는 기본적으로 링크 된 게시물과 동일하지만, 나는 최대 대기 시간을 추가 :

내 기본 페이지 클래스가 포함되어 있습니다. 페이지 클래스 (굉장한, 그것을해라!)에 가기 전에 나는이 정적 함수를 다른 곳에서 만들었고 그것도 효과가 있었다.

2

이것은 거의 확실하게 타이밍 문제입니다. 테스트 할 때 jQuery가 업데이트되지 않았습니다. 인위적인 일시 정지를 도입하거나 기다리는 것이 아니라 AJAX가 예상대로 작동했음을 보여주는 것을 기다리는 것이 가장 좋습니다. WaitUntil 멋지게 일을해야이 경우

는 :

Assert.IsTrue(browser.Div("foo")).WaitUntil(c => c.Text.Contains("gak"))); 

이것은 대부분의 업데이트 등을 작동합니다. 또 다른 흔한 대기 패턴은 데이터로드시에 회전 휠이 표시된 위치를 말합니다. 그런 다음이 바퀴가 사라질 때까지 기다릴 수 있습니다.

WaitUntil(c => c.Style.Display == "none"); 
관련 문제