我们正在使用Watin进行验收测试,一旦我们拥有超过100K的HTML源网页,我们发现它会变得非常慢。
我感觉一些速度问题来自迭代HTML表。我们的一些表有50-60行,每行有5-10列,这使得Watin在页面上搜索项目时速度很慢。
是否有人对(例如)要使用的元素搜索方法的最佳重载有具体建议?是否有特定的方法可以避免,因为它们真的很慢?
答案 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