为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哈士奇WWW 2021-09-15 10:52:10
我的网站生成任意数量的弹出窗口(请不要评判我的监控策略)。每个弹出窗口都是一个复杂的 div,我最终希望通过 xpath 引用它,但我特别想要添加到 DOM 的最后一个,因为它将是最上面的那个。所以我试过这个//*[@class="popupContent"][last()]我知道我可以试试这个(//*[@class="popupContent"])[2]但我不知道有多少这些弹出窗口。但是在屏幕上同时有多个弹出窗口的情况下,我会得到第一个的引用(我不确定这是否可靠)。这些弹出窗口中的每一个都有一个 popupContainer,但对于这个问题,它是不受限制的。鉴于此类中有多个元素,我如何才能获得最上面的元素(因此是交互式的)?这些东西不是兄弟姐妹、孩子或彼此的父母。此外,我不知道在任何给定时间页面上存在多少。除了我知道其中一个内部组件 (popupContent) 的类之外,我也无法控制弹出窗口的内容或结构。如果这是不可能的,请解释原因。我正在寻找在 Java Selenium 测试环境中兼容的解决方案。请不要jquery。
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

根据这个问题:Do WebDriver findElements 在其检索时保留表行顺序findElements 保证顺序,因此在 Selenium 环境中,我可以从中获取列表并检索最后一项。


List<WebElement> popups = findElements(By.classname("popup"));

WebElement activePopup = popups.get(popups.size - 1);


查看完整回答
反对 回复 2021-09-15
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

另一种方法可能是查找具有最高 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;

}


查看完整回答
反对 回复 2021-09-15
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 222 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信