我的网站会生成任意数量的弹出式窗口(请不要判断我的监控策略)。每个弹出窗口都是一个复杂的div,我最终希望通过xpath对其进行引用,但是我特别希望添加到DOM中的最后一个,因为那将是最上面的那个。
所以我尝试了
//*[@class="popupContent"][last()]
我知道我可以尝试
(//*[@class="popupContent"])[2]
但是我不知道有多少这样的弹出窗口。
但是,如果一次在屏幕上显示多个弹出窗口,我会引用第一个弹出窗口(我不确定是否确实是这种情况)。这些弹出窗口中的每一个都有一个popupContainer,但是出于这个问题的考虑,它是不受限制的。
鉴于此类中有多个元素,我如何才能获得最顶部的元素(并因此成为互动元素)?
这些不是兄弟姐妹,孩子或彼此的父母。另外,我不知道在任何给定时间页面上有多少个。除了我知道其内部组件之一(popupContent)的类之外,我还无法控制弹出窗口的内容或结构。
如果这不可能,请解释原因。
我正在寻找一种与Java Selenium测试环境兼容的解决方案。请不要使用jQuery。
答案 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;
}