通过xpath将特定类的最后添加的元素获取到DOM

时间:2018-09-11 21:37:03

标签: java selenium xpath

我的网站会生成任意数量的弹出式窗口(请不要判断我的监控策略)。每个弹出窗口都是一个复杂的div,我最终希望通过xpath对其进行引用,但是我特别希望添加到DOM中的最后一个,因为那将是最上面的那个。

所以我尝试了

//*[@class="popupContent"][last()]

我知道我可以尝试

(//*[@class="popupContent"])[2]

但是我不知道有多少这样的弹出窗口。

但是,如果一次在屏幕上显示多个弹出窗口,我会引用第一个弹出窗口(我不确定是否确实是这种情况)。这些弹出窗口中的每一个都有一个popupContainer,但是出于这个问题的考虑,它是不受限制的。

鉴于此类中有多个元素,我如何才能获得最顶部的元素(并因此成为互动元素)?

这些不是兄弟姐妹,孩子或彼此的父母。另外,我不知道在任何给定时间页面上有多少个。除了我知道其内部组件之一(popupContent)的类之外,我还无法控制弹出窗口的内容或结构。

如果这不可能,请解释原因。

我正在寻找一种与Java Selenium测试环境兼容的解决方案。请不要使用jQuery。

3 个答案:

答案 0 :(得分:0)

根据这个问题:Do WebDriver findElements retain the Table rows order on its retrieval findElements保证顺序,因此在Selenium环境中,我可以从中获取列表并检索最后一个项目。

>>> words = line.split()
>>> words[2]
'44.0000'
>>> int(float(words[2]))
44

答案 1 :(得分:0)

Xpath (//*[@class="popupContent"])[last()]和下面的代码应该给您相同的结果-DOM中的最后一个元素:

List<WebElement> popups = driver.findElements(By.className("popup"));
WebElement activePopup = popups.get(popups.size - 1);

如果最后一个元素不是最重要的元素,请尝试获得重点关注的元素:

WebElement focused = driver.switchTo().activeElement();
if (focused.getAttribute("class").equals("popupContent"))
    //my active/interactive popup

您可以检查上一个是否正在活动:

WebElement lastOne = driver.findElement(By.xpath("(//*[@class="popupContent"])[last()]"));
if (lastOne.equals(driver.switchTo().activeElement()))
//last one is active

答案 2 :(得分:0)

另一种方法可能是查找具有最高z-index值的弹出窗口:

private WebElement getTopPopUp() {
    List<WebElement> allPopUps = driver.findElements(By.classname("popup"));
    WebElement topPopUp = allPopUs.get(0);
    for(WebElement popUp : allPopUs) {
        if(Integer.parseInt(popUp.getCssValue("z-index")) > Integer.parseInt(topPopUp.getCssValue("z-index"))) {
            topPopUp = popUp;
        }
    }
    return topPopUp;
}