提问人:Rahil Kumar 提问时间:11/8/2023 最后编辑:KunduKRahil Kumar 更新时间:11/8/2023 访问量:84
寻找简单/高效的动态 Xpath
Looking for précised/Efficient Dynamic Xpath
问:
很长一段时间后,我正在(任何战斗预订搜索引擎 - MMT 作为参考)上练习 Xpath 创建,并且与动态 xpath 相关的查询很少。我的查询在下面
- 编写了一个 xpath 来从 LineItem 列表中查找航空公司名称。下面是返回第 3 行项目详细信息的 Xpath。这是否有效或精确地获取第 3 行项目?
//div[@class="clusterContent"]/div/div[3]/div/div[2]/div/div//following::div/p[2]
- 为了获取所有行项目,我编写了如下 xpath
//div[@class='clusterContent']/div
将给我行项目列表,将其存储在列表中,我将迭代下面的 xpath 直到这个大小。
@FindBy(xpath="//div[@class='clusterContent']")
List<WebElement> totalNoFlight;
public void getFlightCount()
{
int size = totalNoFlight.size();
for(int i=0;i<size;i++)
{
WebElement videoCliplnk = driver
.findElement(By.xpath("//div[@class='clusterContent']/div/div["+i+"]/div/div[2]/div/div//following::div/p[2]"));
String videoLinkhrs = videoCliplnk.getText();
}
}
这是在POM页面工厂设计模式中编写这些动态xpath之王的正确方法吗?
答:
航空公司名称似乎具有唯一的类别名称定位器。
卡片定位器是包含类的元素。listingCard
名称容器定位器是包含类的元素。airline-info-wrapper
最后,航空公司名称是元素,其中一类是 .airlineName
所以,你得到了一个结果:
//*[contains(@class,'listingCard ')]//*[contains(@class, 'airline-info-wrapper')]//*[contains(@class,'airlineName')]
如果你不关心容器的根目录,它可以更短 - 只是
//*[contains(@class,'airlineName')]
但是,如果您不仅关心名称,还需要获取卡片容器列表,遍历它并获取所需的信息。//*[contains(@class,'listingCard ')]
//div[@class="clusterContent"]/div/div[3]/div/div[2]/div/div//following::div/p[2]
上面的 XPath 表达式不正确。它定位了 144 个元素(见下面的屏幕截图)。
要查找/获取搜索结果的第 3 行,您可以使用以下 XPath 表达式:
(//div[@class='makeFlex spaceBetween'])[3]
-- 这将返回搜索结果的第三行。只需更改第三行的最后一位数字,第四行,依此类推。<div>
3
4
(//div[@class='makeFlex spaceBetween'])[3]//p
-- 这将返回第三行的所有节点。<p>
若要从搜索结果中获取航空公司名称,请使用以下 .xpath
//div[@class='makeFlex spaceBetween']//p[contains(@class, 'airlineName')]
理想情况下,您应该先使用一些延迟来加载页面,然后使用以下代码。
List<WebElement> totalNoFlight = driver.findElements(By.xpath("//div[@class='makeFlex spaceBetween']//p[contains(@class, 'airlineName')]"));
for(int i = 0; i < totalNoFlight.size(); ++i) {
system.out.println(totalNoFlight.get(i).getText());
}
评论