2013-03-06 44 views
2

我试图用一个JavascriptExecutor来自硒的webdriver在IE9中打开一个新标签:硒JavascriptExecutor上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:驱动程序试图单击该元素的位置未滚动到视口中。

我使用硒和IEDriverServer的2.31版本。

+0

IE可能没有时间呈现您添加到DOM的元素,因此它的坐标不在浏览器视口内。在调用'click()'之前,你可以尝试稍微等一下,看看它是否有效。但是,IE驱动程序可能不会识别新标签。即使它确实认可它,尝试点击新标签中的任何元素可能由于焦点问题而无法工作。我担心你可能会试图实现[这篇文章]的解决方法(http://stackoverflow.com/questions/6421988/webdriver-open-new-tab),这是完全错误的方法。 – JimEvans 2013-03-06 22:09:52

+0

我想实现该解决方法,因为我必须使用选项卡进行测试,并且这是使用webdriver这样做的唯一方法。正如我所说的,这种方法在Chrome中运行得非常好,并且webdriver getWindowHandles()和switchTo()方法确实允许在标签页/窗口之间切换。 – Jess 2013-03-07 11:06:10

+0

通常情况下,我只是让这个去,但“不得不使用标签”真的蹭我错了。我无法想象在新选项卡中打开页面不等于在新窗口中打开的任何要求。如果用户将浏览器设置设置为强制页面在新窗口中打开,该怎么办? – JimEvans 2013-03-07 12:06:36

回答

2

管理来解决问题,视得&的IEDriverServer到与Windows正确的交互后有点哄所以以为我会发布我的情况下,任何人有这个问题的解决方案。

要解决视问题,我用行动做了moveToElement然后单击:

public void actionsClick(WebElement element){ 
    Actions builder = new Actions(webDriver); 
    builder.moveToElement(element).click(element).perform(); 
} 

的IEDriverServer似乎需要一点时间来拿起所有的窗口句柄,所以我加了5秒的等待入执行点击后的openTab方法:

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( )点击和w后的方法爱听。 使用JavaScriptExecutor打开一个新选项卡会将焦点留在原始选项卡中,并且此方法将设置为在焦点回到那里时结束。 如果有人已经不使用窗口前处理,这里是我使用的用于切换到新开启的分页方法:

类似的方法被用于回迁除了我得到当前手柄,然后循环遍历列表以找到它的位置,然后从那里移动到-1的句柄。

希望这是有帮助的。

编辑:这适用于IE9和Chrome。未在其他浏览器中测试过。

6

我一直在IE9中使用并行VM。这些是两行取得了整个事情的工作......

Actions builder = new Actions(webDriver); 
builder.moveToElement(element).click(element).perform(); 

滚动元素进入视线,然后点击它。