我正在尝试使用JavascriptExecutor在selenium webdriver中打开IE9中的新标签:
public void openTab() {
String url = webDriver.getCurrentUrl();
String script = "var a=document.createElement('a');a.target='_blank';a.href='" + url + "';a.innerHTML='open';document.body.appendChild(a);return a";
Object element = getJSExecutor().executeScript(script);
if (element instanceof WebElement) {
WebElement anchor = (WebElement) element;
anchor.click();
} else {
throw new RuntimeException("Unable to open tab: " + url);
}
}
这在Chrome中运行良好,但在IE9中运行时,我收到以下错误:
ElementNotVisibleException:驱动程序尝试单击元素的点未滚动到视口中。
我正在使用selenium和IEDriverServer的2.31版本。
答案 0 :(得分:6)
我在IE中的并行虚拟机中遇到了这个困难。这两条线让整个事情发挥作用......
Actions builder = new Actions(webDriver);
builder.moveToElement(element).click(element).perform();
将元素滚动到视图中,然后单击它。
答案 1 :(得分:3)
管理解决视口问题&在稍微哄骗之后让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。未在其他浏览器中测试过。