В ожидании изменения текста в WatiN - PullRequest
1 голос
/ 22 октября 2009

Я пытаюсь протестировать веб-страницу с вызовами ajax для обновления цены. Ajax-вызов запускается при загрузке страницы, чтобы обновить изначально пустой div.

Это метод расширения, который я использую, чтобы дождаться изменения во внутреннем тексте div.

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

Однако это не делает паузу, даже когда я записываю старое значение и т. Е. Элемент (id). Текст после ожидания, они оба равны нулю. Я не могу отладить, так как это действует как пауза.

Может ли Find.ByText не обрабатывать нули или я что-то не так понял?

Кто-нибудь получил код, работающий подобным этому?

1 Ответ

2 голосов
/ 22 октября 2009

В конце концов я нашел собственное решение, углубившись в ограничения 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));
}

Предполагается, что старое значение будет прочитано до изменения, поэтому существует небольшая вероятность возникновения состояния гонки, если вы используете его слишком долго после запуска обновления, но оно работает для меня.

...