寻找简单/高效的动态 Xpath

Looking for précised/Efficient Dynamic Xpath

提问人:Rahil Kumar 提问时间:11/8/2023 最后编辑:KunduKRahil Kumar 更新时间:11/8/2023 访问量:84

问:

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

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

//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之王的正确方法吗?

enter image description here

java selenium-webdriver xpath domxpath

评论


答:

1赞 Yaroslavm 11/8/2023 #1

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

卡片定位器是包含类的元素。listingCard

名称容器定位器是包含类的元素。airline-info-wrapper

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

所以,你得到了一个结果:

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

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

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

但是,如果您不仅关心名称,还需要获取卡片容器列表,遍历它并获取所需的信息。//*[contains(@class,'listingCard ')]

1赞 Shawn 11/8/2023 #2
//div[@class="clusterContent"]/div/div[3]/div/div[2]/div/div//following::div/p[2]

上面的 XPath 表达式不正确。它定位了 144 个元素(见下面的屏幕截图)。

enter image description here

要查找/获取搜索结果的第 3 行,您可以使用以下 XPath 表达式:

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

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

1赞 KunduK 11/8/2023 #3

若要从搜索结果中获取航空公司名称,请使用以下 .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());
}

评论

1赞 Rahil Kumar 11/8/2023
因此,我可以将这个 XPath 定义为@findBy变量并在页面操作方法中使用..!