我的主网页包含多个链接,其中一个是模态。当我单击"了解更多"(请参阅下面的HTML代码)时,主页顶部会打开一个模式。我可以比较预期和实际的链接,但对于主页上的其余链接,我无法比较实际和预期。这些链接在单独的窗口中显示其内容。HTML 没有 IFRAME 标记。
谢谢
<span id="ctl00_ContentPlaceHolder1_ExpirationDate" class="ExpirationDateSkin">
<span class='topCopy'>Enter your account # below and<br />click "Register" <br /> to take advantage of this promotion.
</span><div class='learnMoreLink'>
<span class='adaScnReaderText'>open overlay
</span>
<a href='#'>Learn More</a></div></span>
这是您请求的代码。请阅读上面的问题。谢谢
String mainWindowHandle=driver.getWindowHandle();
driver.findElement(By.xpath("//span[@id='ctl00_PlaceHolder1_ExpirationDate']/div/a")).click();
Set s = driver.getWindowHandles();
Iterator i = s.iterator();
while(i.hasNext())
{
String popupHandle=i.next().toString();
if(!popupHandle.contains(mainWindowHandle)) {
driver.switchTo().window(popupHandle);
}
driver.findElement(By.xpath("//div[@id='enroll']/div/div/a")).click();
}
您可以通过多种不同的方式导航到其他位置。
举几个例子:
-
driver.get(...)
-
driver.switchTo().frame(...)
-
driver.switchTo().window(...)
-
driver.switchTo().defaultContent()
-
driver.findElement(...).click()
-
driver.navigate().back()
-
driver.navigate().forward()
-
driver.navigate().to(...)
-
driver.navigate().refresh()
但是一旦你这样做了,你从以前的 DOM 中获得的任何元素都可能变得"过时"。
为了避免在您的特定示例中出现这种情况,请首先保存所有相关窗口句柄字符串的列表:
List<String> handles = new ArrayList<String>();
Set s = driver.getWindowHandles();
Iterator i = s.iterator();
while (i.hasNext())
{
String popupHandle = i.next().toString();
if (!popupHandle.contains(mainWindowHandle))
handles.add(popupHandle);
}
然后,切换到每个窗口并在该窗口上执行任何您想执行的操作:
for (String handle : handles)
{
driver.switchTo().window(handle);
// Do whatever you wanna in here
driver.switchTo().defaultContent();
}
请注意,在某些网页上,窗口句柄名称可能会随着您"进出"网页而更改。这个案子也可以处理,但有点棘手;如果需要帮助,请告诉我...