我有一个网页,生成的订单显示在列表中。我对订单详细信息部分有限制,其中包含新生成的订单 ID 并验证订单日期和订单状态。
<div class="section order-item">
<div class="title">
<strong> Order Number: 1772269 </strong>
</div>
<ul class="info">
<li>Order status: Pending</li>
<li>Order Date: 8/16/2024 1:52:45 AM</li>
<li>Order Total: 807.00</li>
</ul>
</div>
在上面的 html 树中,我需要约束订单号为 1772269 的订单项部分,然后检查订单状态是否为待处理,订单日期是否为当前日期。请注意,订单号是在运行时生成的。
使用 driver.findElement() 函数,我可以在运行时动态传递订单号并验证订单号。
WebElement orderNumber = driver.findElement(By.xpath("//div[@class='section order-item']//div[@class='title']//strong[contains(text(),'"+orderNum+"')]"));
查询1:如何在PageFactory模型中实现这一点。因为,在页面工厂模型中,如果我给出相同的格式,它不接受动态值。
@FindBy(xpath="//div[@class='section order-item']//div[@class='title']//strong[contains(text(),'Order Number: "+orderNum+"')]") WebElement orderNumber;
查询 2:我能够使用 Xpath 遍历直到 OrderNumber
//div[@class='section order-item']//div[@class='title']//strong[contains(text(),'Order Number: 1772269')]
但是如何获取 orderStatus 和 Order date。如果我尝试输入
//div[@class='section order-item']//div[@class='title']//strong[contains(text(),'Order Number: 1772269')]//ul
它没有到达路径。
我想你还没有理解XPath中
//
的含义。
我建议您阅读 XPath 1.0 规范中的 Location Paths 部分,以便了解 XPath 路径表达式中的不同“轴”是什么,并了解缩写形式,例如
a/b
是 a/child::b
的缩写, a/@b
表示 a/attribute::b
,a//b
表示 a/descendant-or-self::node()/b
(或更简洁地说 a/descendant::b
)。
NB
//
习语对于“跳过”深度嵌套层次结构中的多个元素很有用,即它在 XML 层次结构的一部分内执行“深度搜索”。但你不需要它,除了在表达式的开头,初始的 //
将从文档的根目录中搜索 div[@class='section order-item']
。
您不需要在 div[@class='title']
的后代中
搜索
//div[@class='section order-item']
,因为两个 div
元素是父元素和子元素,您可以简单地使用 /
,这同样适用于嵌套的 div
及其 strong
子元素,例如
//div[@class='section order-item']/div[@class='title']/strong
其次,
ul
不是strong
元素的后代,因此以strong//ul
结尾的路径表达式永远不会返回任何内容。 ul
是 //div[@class='section order-item']
的子元素,li
元素是 ul
的子元素,即三个 li
元素可以通过以下位置路径进行寻址:
//div[@class='section order-item']/ul/li
结合这些 XPath 表达式,我们可以选择外部
div
,它具有我们想要的特定订单号、“待处理”状态和特定日期,表达式如下:
//div
[@class='section order-item']
[div[@class='title']/strong[contains(., '1772269')]]
[ul/li = 'Order status: Pending']
[ul/li
[starts-with(., 'Order Date')]
[contains(., ' 8/16/2024')]
]