提高Watin的性能和速度

时间:2009-07-14 14:39:17

标签: performance integration-testing watin

我们正在使用Watin进行验收测试,一旦我们拥有超过100K的HTML源网页,我们发现它会变得非常慢。

我感觉一些速度问题来自迭代HTML表。我们的一些表有50-60行,每行有5-10列,这使得Watin在页面上搜索项目时速度很慢。

是否有人对(例如)要使用的元素搜索方法的最佳重载有具体建议?是否有特定的方法可以避免,因为它们真的很慢?

3 个答案:

答案 0 :(得分:3)

我为帮助加快Table元素的处理所做的工作是编写了一个扩展方法,通过在表行上调用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;
            }
        }
    }
}

您需要做的就是获取对Table的引用,它将找到第一个tr并迭代它的所有兄弟姐妹。

foreach ( TableRow tr in ie.Table( "myTable" ).TableRowEnumerator() )
{
    //Do Someting with tr
}

答案 1 :(得分:1)

您可以通过向html表行或列元素添加ID来加快速度。因此,在您拥有较少列的情况下,可能更容易将ID添加到至少列。 (特别是因为行数可能正在改变)。

所以而不是

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;

答案 2 :(得分:0)

只是一个与Watin性能相关的小注释,我发现某些代码片段大大减慢了watin程序(我不知道为什么)。我在这里写到:

http://me-ol-blog.blogspot.co.il/2011/08/some-thoughts-about-watin-windows-7.html