寻找精确/高效的动态Xpath

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

我在很长一段时间后在(任何战斗预订搜索引擎 - MMT 作为参考)上练习 Xpath 创建,并且很少有与动态 xpath 相关的查询。我的查询如下

  1. 编写了一个 xpath 以从 LineItem 列表中查找航空公司名称。下面是返回第三行项目详细信息的 Xpath。获取第三个订单项是否高效或精确?

//div[@class="clusterContent"]/div/div[3]/div/div[2]/div/div//following::div/p[2]

  1. 为了获取所有行项目,我编写了如下的 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之王的正确方法吗?

selenium-webdriver xpath domxpath
2个回答
0
投票

航空公司名称似乎通过类别名称具有唯一的定位器。

卡片定位器是包含类

listingCard 
的元素。

名称容器定位器是包含类

airline-info-wrapper
的元素。

最后,航空公司名称是元素,其中类别之一是

airlineName

所以,你得到了结果:

//*[contains(@class,'listingCard ')]//*[contains(@class, 'airline-info-wrapper')]//*[contains(@class,'airlineName')]

如果你不关心容器根,它可以更短 - 只是

//*[contains(@class,'airlineName')]

但是如果您不仅关心名称,您还需要获取卡片容器列表

//*[contains(@class,'listingCard ')]
,循环遍历它并获取所需的信息。


0
投票
//div[@class="clusterContent"]/div/div[3]/div/div[2]/div/div//following::div/p[2]

以上 XPath 表达式不正确。它找到了 144 个元素(见下面的截图)。

要定位/获取搜索结果的第三行,您可以使用以下 XPath 表达式:

(//div[@class='makeFlex spaceBetween'])[3]
-- 这将返回搜索结果的第三行
<div>
。只需更改第三行的最后一位数字
3
,第四行的
4
,依此类推。

(//div[@class='makeFlex spaceBetween'])[3]//p
-- 这将返回第三行的所有
<p>
节点。

© www.soinside.com 2019 - 2024. All rights reserved.