我試圖在使用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在本地計算機上嘗試了這些代碼,但仍然失敗,因此看起來不是環境問題。
乾杯, 達爾文。