Стандартные атрибуты Atata для поиска ячеек таблицы FindByColumnHeaderAttribute
и FindByColumnIndexAttribute
не будут работать для такой таблицы, поскольку строки имеют различное количество элементов ячейки <td>
из-за rowspan
.
Я создал отдельный пример проекта https://github.com/atata-framework/atata-samples/tree/master/TableWithRowSpannedCells в atata-samples
репозитории, чтобы поэкспериментировать с такой таблицей и найти решение. Я закончил с 3 подходами к вашему столу. Поэтому перейдите по ссылке, чтобы проверить источники и подробную информацию о них.
Вот первый и простой подход с использованием поиска с помощью XPath:
using Atata;
namespace AtataSamples.TableWithRowSpannedCells
{
using _ = TableUsingXPathPage;
[Url("table-with-row-spanned-cells")]
public class TableUsingXPathPage : Page<_>
{
public Table<UserRow, _> Users { get; private set; }
public class UserRow : TableRow<_>
{
[FindByXPath(XPathTo.RowSpannedCell, Index = 0)]
public Text<_> Name { get; private set; }
[FindByXPath(XPathTo.RowSpannedCell, Index = 2)]
[Format("yyyy-MM-dd")]
public Date<_> StartDate { get; private set; }
[FindByXPath(XPathTo.RowSpannedCell, Index = 8)]
public Text<_> ExpertiseLevel { get; private set; }
[FindByXPath(XPathTo.NonRowSpannedCell, Index = 0)]
public Text<_> Client { get; private set; }
[FindByXPath(XPathTo.NonRowSpannedCell, Index = 1)]
public Text<_> Project { get; private set; }
[FindByXPath(XPathTo.NonRowSpannedCell, Index = 16)]
public Number<_> DirectProjectCost { get; private set; }
[FindByXPath(XPathTo.RowSpannedCell, Index = 22)]
public Number<_> GrossMarginPercent { get; private set; }
private static class XPathTo
{
public const string RowSpannedCell = "(self::*[td[@rowspan]] | preceding-sibling::tr[td[@rowspan]])[last()]/td[@rowspan]";
public const string NonRowSpannedCell = "td[not(@rowspan)]";
}
}
}
}
Идея состоит в том, чтобы обнаруживать и разбивать элементы ячейки <td>
на два типа: с атрибутом rowspan
и без него.
- Ячейки без
rowspan
можно найти в области действия <tr>
: "td[not(@rowspan)]"
(примечание: это относительный XPath, который будет выполняться для конкретного <tr>
)
- Ячейки с
rowspan
могут отсутствовать в tr
, и в этом случае вам нужно найти эти ячейки у ближайшего предшествующего брата <tr>
, который содержит rowspan
: "(self::*[td[@rowspan]] | preceding-sibling::tr[td[@rowspan]])[last()]/td[@rowspan]"
Таким образом, вы находите ячейку с помощью одного из XPath'ов в зависимости от типа ячейки и указываете ее индекс в области видимости строк того же типа.
Проверьте Таблица с клетками со строками образец для других подходов и деталей.