包含 2 个项目 returns 第一个项目的 ControlList 两个项目的文本元素

ControlList which contains 2 items returns first items Text element for both items

我有以下代码:

public ControlList<PaymentItem, _> PaymentGroup { get; private set; }

[ControlDefinition("div[@id='grant-details']//div", ContainingClass = "payment-details", ComponentTypeName = "Payment Item")]
public class PaymentItem : Control<_>
{
     [FindByXPath("//a[contains(@class, 'test-payment-details-toggle')]")]
     public Link<_> Caret { get; private set; }

     [FindByXPath("//strong[text() = 'Special Instructions:']/parent::p")]
     public Text<_> SpecialInstructions { get; private set; }
}

当我运行时,源代码中的HTML有2个div匹配PaymentItem,其中第一个有SpecialInstructions Text对象和一个字符串“None”的值,而第二个有一些随机文本,但 PaymentGroup[0].SpecialInstructions 和 PaymentGroup[1].SpecialInstructions 都 return “None”的值 - 看起来从文档根目录执行 FindByXPath,而不是使用匹配的 class //div - 我做错了什么?

问题是 [FindByXPath("//strong[text() = 'Special Instructions:']/parent::p")] 中的 XPath 不正确。将开头的 // 替换为 .//,或者直接将其删除(.// 将默认添加到后台)。

  • // - 从 HTML 文档的根部查找元素。
  • .// - 在父 Atata 组件的元素内找到一个元素。

此外,我会将[FindByXPath("//a[contains(@class, 'test-payment-details-toggle')]")]简化为[FindByClass("test-payment-details-toggle")]Link<TOwner> 在它的控件定义中引用了 <a>,所以你只需要添加一个 class 选择器。