Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阅读Watin中的DOM_C#_Visual Studio 2010_Watin - Fatal编程技术网

C# 阅读Watin中的DOM

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">

我正在编写watin脚本,它可以在电子商店上阅读表单。在这个测试中,我必须阅读一些项目的价格,但我总是从页面上的第一个项目获得信息。 我知道关键字,应该从“美元”和“欧元”中读取值

请帮忙

表格示例

<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
如果我有时间,我将把这个例子转换成一个控件。你能发布两个项目的HTML示例吗

2011年2月4日更新:

上一个例子有很多关于HTMLDOM结构的知识,下面的代码将这些知识抽象成一个可重用的控件。这提供了一个关于项的dom结构的单一事实点,使其可重用并保持(测试)代码的干净

项控件的作用域是包含项信息的表。我需要一个有两个项目的例子来解决这个问题。这些项表是“可识别的”,因为它们有一个包含“项”的类名。控件内的所有元素查找都在匹配表的范围内完成

    [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
如果我有时间,我将把这个例子转换成一个控件。你能发布两个项目的HTML示例吗

2011年2月4日更新:

上一个例子有很多关于HTMLDOM结构的知识,下面的代码将这些知识抽象成一个可重用的控件。这提供了一个关于项的dom结构的单一事实点,使其可重用并保持(测试)代码的干净

项控件的作用域是包含项信息的表。我需要一个有两个项目的例子来解决这个问题。这些项表是“可识别的”,因为它们有一个包含“项”的类名。控件内的所有元素查找都在匹配表的范围内完成

    [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从块和中获取值