Как использовать Watin для тестирования Ajax Wedsites? - PullRequest
2 голосов
/ 11 ноября 2010

// с помощью watin test некоторых ajax-сайтов, когда щелкните td, div ("appendProdctTreeDiv") покажет какой-нибудь ответ html, но я не знаю, как получить этот div innerhtml и щелкнуть ссылку, которую я хочу; Можно привести несколько примеров с помощью теста «http://www.google.com/ig”?thanks заранее» 100


------ с использованием watin --------
IE т.е. = новый IE ();
....
ie.Element (Find.ById ( "дерево")) Нажмите ();.
textbox1.text = ie.Div ("appendProdctTreeDiv"). innerHtml; // этот путь неверен;
...


.. HTML-код ..

<'TD id = tree onclick = showAppendProductTree () noWrap> tab1 <' / TD>

....

<'DIV style = "WIDTH: 100%; HEIGHT: 96%; OVERFLOW: auto" id = appendProdctTreeDivloaded = "false"> <' / DIV>
....


функция showAppendProductTree () {

showTreeTab(3);

if (document.getElementById ("appendProdctTreeDiv") .loaded == "false") {

    var url ="product!changeAppendProduct.do";

var params = "";

var newProductId = document.getElementById("newProductId").value;
    new Ajax.Request(
    url,
    {
        method: 'get',
        parameters: params+"&random="+Math.random(),
        requestHeaders:["Cache-Control","no-cache"],
        onComplete: function(originalRequest){  
        var message = originalRequest.responseText;
        document.getElementById("appendProdctTreeDiv").innerHTML= message;
        document.getElementById("appendProdctTreeDiv").loaded = "true";
                    synAppendTree();
        document.getElementById("waitLoadAppendProd").style.display = "none";
        document.getElementById("searchDiv").style.display = "block";
            }
    });

}
* *} Тысяча двадцать-один

функция showTreeTab (tabId) {

document.getElementById("treeDiv").style.display ="block";

for(var i=1;i<=3;i++){

    if(i==tabId){
        document.getElementById("tree"+i).style.display = "block";
    }
    else{
        document.getElementById("tree"+i).style.display = "none";
    }
}

}

Ответы [ 2 ]

5 голосов
/ 14 ноября 2010

Я думаю, у вас есть несколько вариантов, чтобы дождаться ответа.Вариант 1:

  • Прежде всего, WatiN по умолчанию ждет 30 секунд, пока элемент не появится на странице.Поэтому, если вы знаете идентификатор или текст ссылки, по которой хотите щелкнуть, я ожидаю, что следующий код будет работать:

    ie.Div ("appendProdctTreeDiv"). Link (Find.ByText ("текстссылка ")). Нажмите ();

Если это не так, вот вариант 2:

  • В сценарии запуска ajaxвызовите, в функции обратного вызова oncomplete для загруженного атрибута div устанавливается значение true (ложно в html, который вы включили).Вы можете использовать это в ожидании вызова и затем получить innerhtml или щелкнуть ссылку, по которой хотите щелкнуть:

    ie.Div ("appendProdctTreeDiv"). WaitUntil ("загружено", "верно");

HTH, Jeroen

0 голосов
/ 13 ноября 2010

Вероятно, что асинхронный вызов AJAX все еще выполняется, когда вы получаете innerHtml.

ie.Element (Find.ById ("tree")). Нажмите ();

textbox1.text = ie.Div ("appendProdctTreeDiv"). InnerHtml; // этот путь неверен;

Попробуйте что-то подобное, чтобы увидеть, если выв конечном итоге с ожидаемыми результатами.Это не очень хороший способ сделать это, но проверка очень проста.

ie.Element (Find.ById ("tree")). Click ();

System.Threading.Thread.Sleep (5000);// ждет 5 секунд;сделать больше 5 секунд, если ваш асинхронный вызов занимает больше времени.

textbox1.text = ie.Div ("appendProdctTreeDiv"). innerHtml; // этот путь неверен;

Если сайт использует ASP.NET, чтобы определить, является ли страница асинхронным вызовом, вы можете использовать следующий javascript:

Sys.WebForms.PageRequestManager.getInstance ().get_isInAsyncPostBack ()

Вызов как

bool isInAsync = bool.Parse (т.е. .Eval ("Sys.WebForms.PageRequestManager.getInstance ().get_isInAsyncPostBack () "));

Однако google.com/ig использует MS AJAX, поэтому я не могу найти рабочий пример с использованием приведенного выше JavaScript.

Пример использования wait и гаджета перевода google.com/ig.Вставляйте разные слова в TypeText при каждом запуске или очищайте кеш.ie.GoTo ( "www.google.com/ig");System.Threading.Thread.Sleep (2000);// Ожидание загрузки гаджетов страницы Console.WriteLine (т.е. .Frame ("remote_iframe_10"). Div ("dict_content"). InnerHtml);

        ie.Frame("remote_iframe_10").Form("dictForm").TextField("dictQuery").TypeText("bajar");
        ie.Frame("remote_iframe_10").Form("dictForm").Buttons[0].Click();

        Console.WriteLine(ie.Frame("remote_iframe_10").Div("dict_content").InnerHtml);
        System.Threading.Thread.Sleep(2000);  //Wait for gadget to finish here.
        Console.WriteLine(ie.Frame("remote_iframe_10").Div("dict_content").InnerHtml);
...