2013-03-06 49 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(); 

滾動元素進入視線,然後點擊它。