C# 阅读Watin中的DOM
我正在编写watin脚本,它可以在电子商店上阅读表单。在这个测试中,我必须阅读一些项目的价格,但我总是从页面上的第一个项目获得信息。 我知道关键字,应该从“美元”和“欧元”中读取值 请帮忙 表格示例C# 阅读Watin中的DOM,c#,visual-studio-2010,watin,C#,Visual Studio 2010,Watin,我正在编写watin脚本,它可以在电子商店上阅读表单。在这个测试中,我必须阅读一些项目的价格,但我总是从页面上的第一个项目获得信息。 我知道关键字,应该从“美元”和“欧元”中读取值 请帮忙 表格示例 <table class="item available"> <tbody> <tr> <td class="img-block skyblue-links"> <td class="detail">
<table class="item available">
<tbody>
<tr>
<td class="img-block skyblue-links">
<td class="detail">
<div class="title">
<a href="http://...">KEYWORD</a>
</div>
<p>
<table>
<tbody>
<tr>
<td class="price-status">
<div class="status">
<div class="price">
<div class="eur">
17096
<span>
</div>
<div class="usd">$ 2 129</div>
</div>
<div class="to-buy-link" name="buy_catalog">
</td>
<td class="rating-performance">
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
17096
$ 2 129
这里有一个简单的例子
using (var browser = new IE(new Uri(HtmlTestBaseURI, "Test.htm")))
{
var details = browser.TableCells.Filter(Find.ByClass("detail"));
var item = details.First( cell => cell.Link(Find.ByText("KEYWORD")).Exists);
if (!item.Exists) return;
var euro = item.Div(Find.ByClass("eur")).Text;
var dollar = item.Div(Find.ByClass("usd")).Text;
}
基本步骤:
- 查找具有类详细信息的所有TableCell
- 查找此集合中具有文本“关键字”链接的第一个tablecell
- 如果未找到,请退出
- 否则请阅读表格单元格中的相关div
[Test]
public void Should_be_better_readable_when_modeled_as_control()
{
using (var browser = new IE(new Uri(HtmlTestBaseURI, "Test.htm")))
{
var item = browser.Control<Item>(itm => itm.Title == "KEYWORD");
// OR
// var item = browser.Controls<Item>().First(itm => itm.Title == "KEYWORD");
if (!item.Exists) return;
var euro = item.GetPriceFor("eur");
var dollar = item.GetPriceFor("usd");
}
}
public class Item : Control<Table>
{
public override Constraints.Constraint ElementConstraint
{
get { return Find.ByClass(clss => clss != null && clss.Contains("item")); }
}
public string Title
{
get { return Element.Div(Find.ByClass("title")).Text.Trim(); }
}
public string Url
{
get { return Element.Div(Find.ByClass("title")).Link(Find.First()).Url; }
}
public string GetPriceFor(string currency)
{
return Element.Div(Find.ByClass("price")).Div(Find.ByClass(currency)).Text;
}
}
[测试]
当将public void建模为\u control()时,public void应该\u更好\u可读性\u
{
使用(var browser=newie(新Uri(HtmlTestBaseURI,“Test.htm”))
{
var item=browser.Control(itm=>itm.Title==“关键字”);
//或
//var item=browser.Controls().First(itm=>itm.Title==“关键字”);
如果(!item.Exists)返回;
var euro=项目的GetPriceFor(“欧元”);
var美元=项目的GetPriceFor(“美元”);
}
}
公共类项目:控件
{
公共覆盖约束。约束元素约束
{
获取{return Find.ByClass(clss=>clss!=null&&clss.Contains(“项”);}
}
公共字符串标题
{
get{return Element.Div(Find.ByClass(“title”)).Text.Trim();}
}
公共字符串Url
{
获取{return Element.Div(Find.ByClass(“title”)).Link(Find.First()).Url;}
}
公共字符串GetPriceFor(字符串货币)
{
返回元素.Div(按类查找(“价格”)).Div(按类查找(货币)).Text;
}
}
嗯,,
杰罗恩这里是一个快速而肮脏的例子
using (var browser = new IE(new Uri(HtmlTestBaseURI, "Test.htm")))
{
var details = browser.TableCells.Filter(Find.ByClass("detail"));
var item = details.First( cell => cell.Link(Find.ByText("KEYWORD")).Exists);
if (!item.Exists) return;
var euro = item.Div(Find.ByClass("eur")).Text;
var dollar = item.Div(Find.ByClass("usd")).Text;
}
基本步骤:
- 查找具有类详细信息的所有TableCell
- 查找此集合中具有文本“关键字”链接的第一个tablecell
- 如果未找到,请退出
- 否则请阅读表格单元格中的相关div
[Test]
public void Should_be_better_readable_when_modeled_as_control()
{
using (var browser = new IE(new Uri(HtmlTestBaseURI, "Test.htm")))
{
var item = browser.Control<Item>(itm => itm.Title == "KEYWORD");
// OR
// var item = browser.Controls<Item>().First(itm => itm.Title == "KEYWORD");
if (!item.Exists) return;
var euro = item.GetPriceFor("eur");
var dollar = item.GetPriceFor("usd");
}
}
public class Item : Control<Table>
{
public override Constraints.Constraint ElementConstraint
{
get { return Find.ByClass(clss => clss != null && clss.Contains("item")); }
}
public string Title
{
get { return Element.Div(Find.ByClass("title")).Text.Trim(); }
}
public string Url
{
get { return Element.Div(Find.ByClass("title")).Link(Find.First()).Url; }
}
public string GetPriceFor(string currency)
{
return Element.Div(Find.ByClass("price")).Div(Find.ByClass(currency)).Text;
}
}
[测试]
当将public void建模为\u control()时,public void应该\u更好\u可读性\u
{
使用(var browser=newie(新Uri(HtmlTestBaseURI,“Test.htm”))
{
var item=browser.Control(itm=>itm.Title==“关键字”);
//或
//var item=browser.Controls().First(itm=>itm.Title==“关键字”);
如果(!item.Exists)返回;
var euro=项目的GetPriceFor(“欧元”);
var美元=项目的GetPriceFor(“美元”);
}
}
公共类项目:控件
{
公共覆盖约束。约束元素约束
{
获取{return Find.ByClass(clss=>clss!=null&&clss.Contains(“项”);}
}
公共字符串标题
{
get{return Element.Div(Find.ByClass(“title”)).Text.Trim();}
}
公共字符串Url
{
获取{return Element.Div(Find.ByClass(“title”)).Link(Find.First()).Url;}
}
公共字符串GetPriceFor(字符串货币)
{
返回元素.Div(按类查找(“价格”)).Div(按类查找(货币)).Text;
}
}
嗯,,
杰伦我不明白你想干什么。让我们关注这个例子-你想在这里找到什么?我知道商品的名称,需要阅读该商品的欧元和美元价格。我在示例中标记为关键字的项的名称,我可以找到它。我试图用我的关键字从和块中获取值,但在所有情况下,我都是从页面上的第一个项目中获取价格。在当前的例子中,我需要阅读数字“17096”和“$2129”,因为block-there链接包含关键字,我不明白你们想做什么。让我们关注这个例子-你想在这里找到什么?我知道商品的名称,需要阅读该商品的欧元和美元价格。我在示例中标记为关键字的项的名称,我可以找到它。我试图用我的关键字bu从块和中获取值