阅读 Watin 中的 DOM

发布于 2024-10-15 08:14:18 字数 1266 浏览 3 评论 0原文

我正在研究 watin 脚本,该脚本可以读取电子商店上的表格。在此测试中,我必须读取某些商品的价格,但我总是从页面上的第一个商品获取信息。 我知道关键字,并且应该读取“usd”和“eur”中的值。

请帮忙。

表格示例

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

I'm working on watin script which read forms on e-shop. In this test I must read price of some items, but always I got information from the first item on the page.
I know the KEYWORD, and should read values from "usd" and "eur".

Please help.

Example of table

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

成熟稳重的好男人 2024-10-22 08:14:18

这是一个快速而肮脏的示例

        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;
        }

基本步骤:

  • 查找具有类详细信息的所有 TableCells
  • 查找此集合中第一个具有文本“KEYWORD”链接的表格单元
  • 如果没有找到,则退出,
  • 否则读取表格单元内的相关 div

如果我有到时候我会把这个例子转换成一个控件。您可以发布两个项目的 HTML 示例吗?

2011 年 2 月 4 日更新:

前面的示例有很多关于 html dom 结构的知识,下面的代码确实将这些知识抽象为可重用的控件。这提供了有关项目 dom 结构的单点事实,使其可重用并保持(测试)代码干净。

Item 控件的范围是包含项目信息的表。我需要一个包含 2 个项目的示例来解决这个问题。这些项目表通过它们具有包含“项目”的类名这一事实来“识别”。控件内的所有元素查找都是在匹配表的范围内完成的。

    [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;
        }
    }

哈特哈,
杰罗恩

Here is a quick and dirty example

        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;
        }

Basic steps:

  • Find All TableCells having a class detail
  • Find the First tablecell in this collection that has a link with the text "KEYWORD"
  • If none found, exit
  • else read the relevant divs inside the tablecell

If I have time I'll convert this example into a Control. Could you post example HTML for two items?

update 4 feb 2011:

Previous example had a lot of knowledge of the html dom structure, the following code does abstract this knowledge into a reusable control. This provides one single point of truth regarding the dom structure of an item, makes it reusable and keeps your (test) code clean.

The Item control's scope is the table with the item information. I needed an example with 2 items to figure this out. These item tables are "recognized" by the fact they have a class name containing "item". All element lookups inside the control are done within the scope of the matching table.

    [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;
        }
    }

HTH,
Jeroen

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文