设法解决视口问题并让 IEDriverServer 在经过一番哄骗后与两个窗口正确交互,所以我想我会发布我的解决方案,以防其他人遇到这个问题。
为了解决视口问题,我使用 Actions 执行 moveToElement 然后单击:
public void actionsClick(WebElement element){
Actions builder = new Actions(webDriver);
builder.moveToElement(element).click(element).perform();
}
IEDriverServer 似乎需要更长的时间来获取所有窗口句柄,所以我在单击后在 openTab 方法中添加了 5 秒的等待时间:
public void openTab() {
String url = webDriver.getCurrentUrl();
String script = "var a=document.createElement('a');a.target='_blank';a.href='" + url + "';a.innerHTML='open me in a new tab';document.body.appendChild(a);return a";
Object element = getJSExecutor().executeScript(script);
if (element instanceof WebElement) {
WebElement anchor = (WebElement) element;
actionsClick(anchor);
waitFor(5000);
switchBrowserTab();
returnToPreviousBrowserTab();
} else {
throw new RuntimeException("Unable to open tab: " + url);
}
}
然后,如上面的方法所示,为了确保 IEDriverServer 知道两个窗口/选项卡并可以在它们之间移动,我在单击并等待后添加了 switchBrowserTab() 和 returnToPreviousBrowserTab() 方法。使用 JavascriptExecutor 打开一个新选项卡会将焦点留在原始选项卡中,并且此方法设置为以焦点再次回到那里而结束。如果有人以前没有使用过窗口句柄,这里是我用来切换到新打开的选项卡的方法:
Set<String> handles = webDriver.getWindowHandles();
List<String> handlesList = new ArrayList<String>();
for (String handle : handles) {
handlesList.add(handle);
}
webDriver.switchTo().window(handlesList.get(handlesList.size() - 1));
webDriver.manage().window().maximize();
类似的方法用于向后移动,除了我得到当前句柄,然后循环遍历列表以找到它的位置,然后从那里移动到 -1 的句柄。
希望这会有所帮助。
编辑:这适用于 IE9 和 Chrome。未在其他浏览器中测试。