如何使用动态值(示例 - 生成订单 ID)约束 div 容器以在 Selenium Java 运行时验证嵌套元素值?

问题描述 投票:0回答:1

订单详情页面

我有一个网页,生成的订单显示在列表中。我对订单详细信息部分有限制,其中包含新生成的订单 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
它没有到达路径。

检查订单号

检查订单状态

selenium-webdriver xpath selenium-java dynamic-values
1个回答
0
投票

我想你还没有理解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')]
   ]
© www.soinside.com 2019 - 2024. All rights reserved.