Вот быстрый и грязный пример
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;
}
}
НТН,
Йерун