Читать DOM в Ватине - PullRequest
       15

Читать DOM в Ватине

0 голосов
/ 02 февраля 2011

Я работаю над сценарием 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>

1 Ответ

4 голосов
/ 02 февраля 2011

Вот быстрый и грязный пример

        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, имеющие сведения о классе
  • Найдите первую ячейку таблицы в этой коллекции, которая имеет ссылку с текстом «КЛЮЧЕВОЕ СЛОВО»
  • Если ничего не найдено, выйти
  • иначе прочитайте соответствующие разделы внутри ячейки таблицы

Если у меня будет время, я преобразую этот пример в элемент управления. Не могли бы вы опубликовать пример HTML для двух элементов?

обновление 4 февраля 2011 г .:

В предыдущем примере было много знаний о структуре html dom, следующий код абстрагирует эти знания в повторно используемый элемент управления. Это обеспечивает единственную правду в отношении структуры dom элемента, делает его многоразовым и сохраняет ваш (тестовый) код чистым.

Область действия элемента управления - это таблица с информацией об элементе. Мне нужен пример с 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;
        }
    }

НТН, Йерун

...