2009-10-22 36 views
1

我正在嘗試測試一個有Ajax調用來更新價格的網頁。 在頁面加載時會觸發ajax調用,以更新最初爲空的div。正在WatiN等待文本更改

這是我用來等待div內部文本更改的擴展方法。

public static void WaitForTextChange(this IE ie, string id) 
{ 
    string old = ie.Element(id).Text; 
    ie.Element(id).WaitUntil(!Find.ByText(old)); 
} 

但是它不是,雖然我等待之後寫出來的舊值和ie.Element(ID)。文本甚至暫停,它們都爲null。我無法調試,因爲這是暫停。

Find.ByText可以不處理空值或者我有什麼問題。

有沒有人有類似的代碼工作?

回答

2

在深入研究WatiN的約束條件後,我最終找到了自己的解決方案。

這裏的解決方案:

public class TextConstraint : Constraint 
{ 
    private readonly string _text; 
    private readonly bool _negate; 

    public TextConstraint(string text) 
    { 
     _text = text; 
     _negate = false; 
    } 

    public TextConstraint(string text, bool negate) 
    { 
     _text = text; 
     _negate = negate; 
    } 

    public override void WriteDescriptionTo(TextWriter writer) 
    { 
     writer.Write("Find text to{0} match {1}.", _negate ? " not" : "", _text); 
    } 

    protected override bool MatchesImpl(IAttributeBag attributeBag, ConstraintContext context) 
    { 
     return (attributeBag.GetAdapter<Element>().Text == _text)^_negate; 
    } 
} 

和更新的擴展方法:

public static void WaitForTextChange(this IE ie, Element element) 
{ 
    string old = element.Text; 
    element.WaitUntil(new TextConstraint(old, true)); 
} 

它假定舊值將改變以前那麼有競爭條件,如果稍有機會讀你在啓動更新後使用它太久了,但它對我很有用。

+0

其實。我遇到了另一個問題。有時我更新的價格不會改變,在這種情況下,我想超時,然後繼續下一個用戶操作,但使用 .WaitUntil(new TextConstraint(old,true),2000); 只是卡住了。 – 2009-10-22 08:01:07