2013-12-10 12 views
0

我試圖在使用Selenium + ChromeDriver(Java驅動)的iframe中的文本框中添加一些文本,並且在堆棧中出現以下錯誤追蹤:當JavaScript在Chrome控制檯上正常工作時,Selenium JavaScript執行程序返回null

org.openqa.selenium.WebDriverException: unknown error: Cannot read property 'contentWindow' of null

我使用斷點,以確保整個DOM被加載,這樣不會出現是問題。我還在js.executeScript行的斷點處測試了我的JS在Chrome控制檯中,並且它工作正常。只要我一步一步通過我的測試,它就會失敗並出現相同的錯誤。在JS如何通過Selenium運行而不是通過Chrome控制檯運行它之間似乎存在一些差異。

這裏是DOM的我在看的部分:

<div class="container"> 
<iframe class="rich-text-area" id="EmailMessage"> 
    #document 
    <html> 
    <head> 
    <link rel="stylesheet" type="text/css" href="/static/css/rich-text-editor.css"> 
    <link rel="stylesheet" type="text/css" href="/rest/email/css"> 
    </head> 
    <body contenteditable="true"></body> 
    </html> 
</iframe> 
<textarea class="code" aria-hidden="true" id="emailSource" style="display: none;">   </textarea> 
</div> 

當在Chrome控制檯它是運行我的JS:

document.getElementById('EmailMessage').contentWindow.document.body.appendChild(document.createTextNode('testText'));

我得到了想要的結果,其是身體標籤之間的內部HTML,因此:

<body contenteditable="true">testText</body>

但是,使用下面的代碼運行它時,它會炸燬,並給我上面提到的錯誤。這裏是我的Java代碼運行這一部分:

JavascriptExecutor js = (JavascriptExecutor) driver; 
driver.switchTo().frame(emailBodyID); 
wait.until(ExpectedConditions.visibilityOfElementLocated(emailBodyTag)); 
wait.until(ExpectedConditions.elementToBeClickable(emailBodyTag)); 
js.executeScript("document.getElementById('EmailMessage').contentWindow.document.body.appendChild(document.createTextNode('testText'));"); 
driver.switchTo().defaultContent(); 

任何想法這是怎麼回事?我也試過contentDocument.body。 Chrome和Selenium的結果相同。我將此作爲sendKeys()的替代方案,因爲我不得不爲此測試運行ChromeDriver的舊版本,這已經打破了對iframe中支持sendKeys()的支持。我已經使用最新的ChromeDriver在本地計算機上嘗試了這些代碼,但仍然失敗,因此看起來不是環境問題。

乾杯, 達爾文。

回答

1

看起來我經過一番調查後找到了答案。問題出在driver.switchTo()命令。 Chrome控制檯正在解釋默認頁面級別的代碼,Selenium只從'EmailMessage'開始查看DOM。由於之前使用SendKeys(),這些留在那裏。

將行重新排序以允許iframe中的元素以顯式等待進行檢查,然後將JS在頁面級別上運行。另一種解決方案是將JS字符串更改爲從document.body...開始。我的解決方法是如下:

JavascriptExecutor js = (JavascriptExecutor) driver; 
driver.switchTo().frame(emailBodyID); 
wait.until(ExpectedConditions.visibilityOfElementLocated(emailBodyTag)); 
wait.until(ExpectedConditions.elementToBeClickable(emailBodyTag)); 
driver.switchTo().defaultContent(); 
js.executeScript("document.getElementById('EmailMessage').contentWindow.document.body.appendChild(document.createTextNode('testText'));"); 

相當簡單,有點明顯,在它回頭看(不是一切雖然),但任何人想要在iframe一些JS切換SendKeys()(或執行任何其他行動涉及JS和用Selenium中的iframe改變範圍),這可能是一個鬼鬼祟祟的問題。

相關問題