Улучшение производительности и скорости работы Watin - PullRequest
3 голосов
/ 14 июля 2009

Мы используем Watin для приемочных тестов, и мы обнаруживаем, что он становится очень медленным, когда у нас есть веб-страницы, которые содержат более 100 КБ исходного кода HTML.

У меня такое ощущение, что некоторые проблемы со скоростью возникают из-за перебора таблиц HTML. Некоторые из наших таблиц имеют 50–60 строк, каждая из которых содержит 5–10 столбцов, и это делает Watin довольно медленным при поиске элементов на странице.

У кого-нибудь есть конкретные рекомендации (например) о наилучших перегрузках используемых методов поиска элементов? Существуют ли конкретные методы, которых следует избегать, потому что они действительно медленные?

Ответы [ 3 ]

3 голосов
/ 08 февраля 2010

Чтобы ускорить обработку элементов таблицы, я написал метод расширения для перебора строк таблицы с помощью вызова NextSibling для строки таблицы вместо вызова свойства .TableRows, которое может быть медленным.

public static class IElementContainerExtensions
{
    /// <summary>
    /// Safely enumerates over the TableRow elements contained inside an elements container.
    /// </summary>
    /// <param name="container">The IElementsContainer to enumerate</param>
    /// <remarks>
    /// This is neccesary because calling an ElementsContainer TableRows property can be an
    /// expensive operation.  I'm assuming because it's going out and creating all of the
    /// table rows right when the property is accessed.  Using the itterator pattern below
    /// to prevent creating the whole table row hierarchy up front.
    /// </remarks>
    public static IEnumerable<TableRow> TableRowEnumerator( this IElementContainer container )
    {
        //Searches for the first table row child with out calling the TableRows property
        // This appears to be a lot faster plus it eliminates any tables that may appear
        // nested inside of the parent table

        var tr = container.TableRow( Find.ByIndex( 0 ) );
        while ( true )
        {
            if ( tr.Exists )
            {
                yield return tr;
            }
            //Moves to the next row with out searching any nested tables.
            tr = tr.NextSibling as TableRow;
            if ( tr == null || !tr.Exists )
            {
                break;
            }
        }
    }
}

Все, что вам нужно сделать, это получить ссылку на таблицу, и она найдет первое значение tr и перебирает всех своих братьев и сестер.

foreach ( TableRow tr in ie.Table( "myTable" ).TableRowEnumerator() )
{
    //Do Someting with tr
}
1 голос
/ 03 августа 2009

Вы можете немного ускорить добавление идентификаторов в строки или столбцы HTML-таблицы.Так что в вашем случае, когда у вас меньше столбцов, вероятно, проще добавить идентификаторы хотя бы в столбцы.(Особенно потому, что количество строк, вероятно, меняется).

Таким образом, вместо

string price = ie.Table(Find.ById("name")).TableRows[i].TableCells[i].Text;

с этими изменениями в html

<table id="name">
<tr id='total'>             
            <td id='price'>
                $1.00
            </td>
        </tr>
</table>

без итерации

string total = ie.TableRow(Find.ByID("total")).TableCell(Find.ById("price")).Text;

или только одна итерация

ie.Table(Find.ById("name")).TableRows[i].TableCell(Find.ById("price")).Text;
0 голосов
/ 30 августа 2012

Просто небольшая заметка, связанная с производительностью Watin, я обнаружил, что некоторые фрагменты кода значительно замедляют программы Watin (я не знаю почему). Я написал об этом здесь:

http://me -ol-blog.blogspot.co.il / 2011/08 / некоторые-мысли-о-WatiN-окна-7.html

...